2015-10-07 64 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