C++ Qt:创建一个图像堆栈

C++ Qt:创建一个图像堆栈,c++,qt,stack,qimage,C++,Qt,Stack,Qimage,我是Qt的新手,现在我正在尝试设计一个简单的应用程序来画线。我用QImage和MouseEvent画了几条线(线从鼠标点击开始,到鼠标释放结束) 现在,我想创建一个仅在mouseMoveEvent期间出现的“重影”行。我想使用QImage的堆栈(这将允许我稍后管理undo-redo)来实现这一点。然而,我甚至无法构建堆栈,程序在没有任何解释的情况下崩溃 这是我在头类中的声明 private: QImage image; QStack <QImage> *history

我是Qt的新手,现在我正在尝试设计一个简单的应用程序来画线。我用
QImage
MouseEvent
画了几条线(线从鼠标点击开始,到鼠标释放结束)

现在,我想创建一个仅在
mouseMoveEvent
期间出现的“重影”行。我想使用
QImage
的堆栈(这将允许我稍后管理undo-redo)来实现这一点。然而,我甚至无法构建堆栈,程序在没有任何解释的情况下崩溃

这是我在头类中的声明

private:
    QImage image;
    QStack <QImage> *history

我试着尽可能多地调试,但我所能意识到的是,导致程序崩溃的那一行是
history=newqstack但我不知道它有什么问题。

您需要将空映像推送到构造函数末尾的堆栈中,或者交换行

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


否则,第一次调用
addLine()
history->top()
将无效。

您可能需要将其定义为
history=new QStack()而不是?但是我认为绝对没有必要存储指向堆栈对象的指针。只需将其声明为
QStack history。如果你在做图形,最好使用history=new QStack();以同样的方式崩溃(我已经试过了)。你可能应该直接在小部件上画“鬼线”,而不要在QImage中画它。查看QWidget::paintEvent和相关示例,例如在QPainter docs下。在将任何图像添加到
history
之前调用
addLine()
,因此
history->top()
将不会给出有效的指针。请注意!但是,我是否应该放弃使用vahancho和hyde建议的指针的想法呢?
QStack::top()
“这个函数假设堆栈不是空的。”@fofu是的,这会让你更简单,因为你不必自己做内存管理。正如<代码> QStack <代码>将动态地分配到堆上,绝对不需要这样做(C++堆栈有点限制,所以像 int [100000000 ] 这样的数组必须动态分配。
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();
}
addLine();
history->push(image);