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