关于Qt制作画板中的恢复与撤销功能

lzhpopo_hoho 2014-12-15 05:07:40
我构思的是建立一个Qvector
class paintarea : public QWidget
{
Q_OBJECT

protected:

private:
QVector<QPixmap>pixmaps;
QVector<QPixmap>::iterator it;

public:
然后在鼠标释放鼠标事件时把当时的pixmap存进数组中
void paintarea::mouseReleaseEvent(QMouseEvent*event)
{
if(event->button()==Qt::LeftButton)
{
endpoint=event->pos();
pixmaps.push_back(pixmap);
}
paint(pixmap);
}
然后再paintevent中控制是否撤销或恢复
void paintarea::paintEvent(QPaintEvent *)
{
QPainter pp(this);
pp.setRenderHint(QPainter::Antialiasing, true);
if(function==recind)
{
it--;
pixmap=(*it);
}
else if(function==recover)
{
it++;
pixmap=(*it);
}
if(drawshape==none||drawshape==eraser)
pp.drawPixmap(0,0,pixmap);
else
pp.drawPixmap(0,0,temppixmap);
}
视情况把要显示在屏幕上的pixmap用容器里的替换掉
运行后点击撤销按钮程序就崩溃了,为什么呢?
哎 我对Qt的绘画事件掌握得不牢,单没法从头看了,最近要考试,没时间,希望有知道的兄弟能给我指出下问题
...全文
886 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzhpopo_hoho 2014-12-18
  • 打赏
  • 举报
回复
void MainWindow::on_action_6_triggered() { area->setfunction(area->recind); area->display_function(); qDebug()<<area->keyy; } void paintarea::display_function() { if(function==recind) { it--; keyy--; pixmap=(*it); } else if(function==recover) { it++; pixmap=(*it); } update(); } 我槽函数里也写了update()调用了paintevent函数的呀,我的保存功能里用update()就可以正常显示,所以应该只有一个可能了,就是pixmap根本没保存进vector里,真心求解啊
lzhpopo_hoho 2014-12-18
  • 打赏
  • 举报
回复
改来改去还是有问题 void paintarea::mouseReleaseEvent(QMouseEvent*event) { if(event->button()==Qt::LeftButton) { endpoint=event->pos(); } paint(pixmap); pixmaps.push_back(pixmap); it++; keyy++; } 我调试过后发现keyy的值确实自增了,但是依然显示不出东西,求教难道不能用pixmaps.push_back(pixmap);这种方式来把pixmap保存起来吗?求大家帮个忙吧,这儿就是想不通,也查不到相关资料啊
赵4老师 2014-12-17
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
lzhpopo_hoho 2014-12-16
  • 打赏
  • 举报
回复
这次直接贴出完整代码 求帮助啊,实在不知道哪儿错了 在线等 #include "paintarea.h" #include <QMouseEvent> #include<QPoint> #include<QPainter> #include<QPixmap> #include<QPen> #include<QBrush> #include<QVector> paintarea::paintarea(QWidget *parent) : QWidget(parent) { pixmap=QPixmap(600,400); backcolor=qRgb(255,255,255); pixmap.fill(backcolor); drawshape=none; color=Qt::black; width=1; it=pixmaps.begin(); function=non; } void paintarea::paint(QPixmap& pixmap1) { int x,y,w,h; x=beginpoint.x(); y=beginpoint.y(); w=endpoint.x()-beginpoint.x(); h=endpoint.y()-beginpoint.y(); QPainter pt(&pixmap1); QPen pen; QPen eraser1; eraser1.setColor(Qt::white); eraser1.setWidth(8); pen.setWidth(width); pen.setColor(color); if(drawshape==eraser) { pt.setPen(eraser1); } else pt.setPen(pen); switch(drawshape) { case none: { pt.drawLine(beginpoint,endpoint); beginpoint=endpoint; break; } case line: pt.drawLine(beginpoint,endpoint); break; case rectangle: pt.drawRect(x,y,w,h); break; case ellipse: pt.drawEllipse(x,y,w,h); break; case eraser: { pt.drawLine(beginpoint,endpoint); beginpoint=endpoint; break; } } update(); } void paintarea::paintEvent(QPaintEvent *) { QPainter pp(this); pp.setRenderHint(QPainter::Antialiasing, true); if(function==recind) { it--; pixmap=(*it); } else if(function==recover) { it++; pixmap=(*it); } if(drawshape==none||drawshape==eraser) pp.drawPixmap(0,0,pixmap); else pp.drawPixmap(0,0,temppixmap); } void paintarea::mousePressEvent(QMouseEvent* event) { if(event->button() == Qt::LeftButton) beginpoint=event->pos(); } void paintarea::mouseMoveEvent(QMouseEvent*event) { if(event->buttons()&Qt::LeftButton) { endpoint = event->pos(); if(drawshape == none||drawshape== eraser) { paint(pixmap); } else { temppixmap = pixmap; paint(temppixmap); } } } void paintarea::mouseReleaseEvent(QMouseEvent*event) { if(event->button()==Qt::LeftButton) { endpoint=event->pos(); pixmaps.push_back(pixmap); } paint(pixmap); }
lzhpopo_hoho 2014-12-16
  • 打赏
  • 举报
回复
(⊙o⊙)… 顶一下 求解释啊 今天起来还是没找出问题
lzhpopo_hoho 2014-12-16
  • 打赏
  • 举报
回复
我好像发现问题了 我根本就没把鼠标释放后的pixmap存进去 请问该存在哪里 试了半天都没反应
lzhpopo_hoho 2014-12-16
  • 打赏
  • 举报
回复
是的,不管改不改它,只要点恢复按钮程序都会崩溃
fly_dragon_fly 2014-12-16
  • 打赏
  • 举报
回复
这个drawshape 值初始化后就没改过吗?
lzhpopo_hoho 2014-12-15
  • 打赏
  • 举报
回复
在paintare的构造函数里初始化的,还把他声明在了paintarea的私有属性里
fly_dragon_fly 2014-12-15
  • 打赏
  • 举报
回复
it 在那里初始化的?

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧