2015-10-07 62 views
2

我是Qt的新手,我試圖設計一個簡單的應用程序,現在畫線。我設法使用QImageMouseEvent(線條開始於鼠標點擊並以鼠標釋放結束)。Qt:創建一個圖像的堆棧

現在我想創建一個僅在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 歷史;'。 – 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

使感覺!但是,我是否應該放棄使用指針作爲vahancho和hyde的建議? –

+1

來自'QStack :: top()'文檔的具體引用:*「這個函數假定堆棧不是空的。」* – hyde

+0

@fofu是的,它會讓你更簡單,因爲你沒有自己做內存管理。由於'QStack'將在堆上動態分配,因此絕對不需要這樣做(C++堆棧有一定的限制,所以像'int [100000000]'這樣的數組必須像現在這樣動態分配。) – jhnnslschnr