user-0 提问: 关于Qt制作画板中的恢复与撤销功能

回复:
user: user-0
content: 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里，真心求解啊

user: user-0
content: 改来改去还是有问题 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保存起来吗？求大家帮个忙吧，这儿就是想不通，也查不到相关资料啊

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 这次直接贴出完整代码   求帮助啊，实在不知道哪儿错了  在线等 #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); }

user: user-0
content: (⊙o⊙)…   顶一下   求解释啊   今天起来还是没找出问题

user: user-0
content: 我好像发现问题了  我根本就没把鼠标释放后的pixmap存进去 请问该存在哪里  试了半天都没反应

user: user-0
content: 是的，不管改不改它，只要点恢复按钮程序都会崩溃

user: user-2
content: 这个drawshape 值初始化后就没改过吗？

user: user-0
content: 在paintare的构造函数里初始化的，还把他声明在了paintarea的私有属性里

user: user-2
content: it 在那里初始化的？