2015-10-07 7 views
2

Я новичок в Qt, и я пытаюсь создать простое приложение, которое рисует линии на данный момент. Мне удалось нарисовать линии, используя QImage и MouseEvent (линия начинается с щелчка мыши и заканчивается в выпуске мыши).Qt: Создать стек image

Теперь я хотел бы создать линию «призрак», которая появляется только во время mouseMoveEvent. Я хотел бы сделать это, используя Stack (который позволит мне позже управлять отменой повтора) QImage. Тем не менее, я не могу управлять даже построить стек, программа выходит из строя без каких-либо объяснений

Вот мое заявление в моем заголовке класса

private: 
    QImage image; 
    QStack <QImage> *history 

Вот мой конструктор

Painty::Painty() : image(1920,1080, QImage::Format_ARGB32) 
{ 
    image.fill(Qt::white); 
    history = new QStack <QImage>; 
} 

Здесь являются моими функциями:

void Painty::mousePressEvent(QMouseEvent *event) 
{ 
    f_point = event->pos(); 
} 

void Painty::mouseReleaseEvent(QMouseEvent *event) 
{ 
    l_point = event->pos(); 
    addLine(); 
    history->push(image); 
} 

void Painty::mouseMoveEvent(QMouseEvent *event) 
{ 
    l_point = event->pos(); 
    addLine(); 
} 


void Painty::paintEvent(QPaintEvent *event) 
{ 
    QWidget::paintEvent(event); 
    QPainter painter(this); 
    painter.drawImage(0,0,image); 
} 

void Painty::addLine() 
{ 
    image=history->top(); 
    QPainter paint(&image); 
    paint.drawLine(f_point,l_point); 
    paint.end(); 
    this->update(); 
} 

Я пытался отлаживать столько, сколько мог, но все, d понимают, что строка, которая вызывает сбои программы, - history = new QStack <QImage>;, но я не знаю, что с ней не так.

+0

Возможно, вам нужно определить его как 'history = new QStack ();' вместо этого? Но я думаю, что нет необходимости хранить указатель на свой стек. Просто объявите его как 'QStack history;'. – vahancho

+0

Если вы делаете графику, вам может быть лучше взглянуть на использование [Graphics View Framework] (http://doc.qt.io/qt-5/graphicsview.html) – TheDarkKnight

+0

history = new QStack (); разбился так же (я уже пробовал этот). –

ответ

2

Вам нужно либо нажать на пустое изображение в стек в конце конструктора, или поменять местами строки

addLine(); 
history->push(image); 

в mouseReleaseEvent(...).

В противном случае при первом обращении к addLine()history->top() будет недействительным.

+0

Сделай это! Но должен ли я отказаться от идеи использования указателей, как предложено ваханчо и hyde? –

+1

Конкретная цитата из документов для 'QStack :: top()': * "Эта функция предполагает, что стек не пуст." * – hyde

+0

@fofu Да, это упростит вам, потому что у вас нет для управления памятью. И поскольку 'QStack' будет динамически выделяться в куче, в этом нет необходимости (стеки C++ несколько ограничены, поэтому массив, такой как' int [100000000] ', должен быть распределен динамически так же, как и сейчас). – jhnnslschnr

Смежные вопросы