在Qt中撤消重做

Undo Redo in Qt

本文关键字:重做 撤消 Qt      更新时间:2023-10-16

我在我的Qt应用程序中添加了一个图形视图,其中可以添加不同的项目,如直线,椭圆如何撤消重做操作可以在图形视图中应用。下面是添加项目(如line)的代码。mainwindow.cpp

connect(ui->lineButton, SIGNAL(clicked()), this, SLOT(drawLine()));

line.cpp

void line::mousePressEvent(QGraphicsSceneMouseEvent* e){
    if(e->button()==Qt::LeftButton) {
        if(mFirstClick){
            x1 = e->pos().x();
            y1 = e->pos().y();
            mFirstClick = false;
            mSecondClick = true;
        }
        else if(!mFirstClick && mSecondClick){
            x2 = e->pos().x();
            y2 = e->pos().y();
            mPaintFlag = true;
            mSecondClick = false;
            update();
        }
    }
    QGraphicsItem::mousePressEvent(e);
    update();
}
void line:: paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    QRectF rect = boundingRect();
    if(mPaintFlag){
        QPen paintpen(Qt::red);
        paintpen.setWidth(4);
        QPen linepen(Qt::black);
        linepen.setWidth(1);
        QPoint p1;
        p1.setX(x1);
        p1.setY(y1);
        painter->setPen(paintpen);
        painter->drawPoint(p1);
        QPoint p2;
        p2.setX(x2);
        p2.setY(y2);
        painter->setPen(paintpen);
        painter->drawPoint(p2);
        painter->setPen(linepen);
        painter->drawLine(p1, p2);
    }
}
void line::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
{
    if (e->modifiers() & Qt::ShiftModifier) {
        stuff << e->pos();
        update();
        return;
    }
    QGraphicsItem::mouseMoveEvent(e);
}
void line::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
    QGraphicsItem::mouseReleaseEvent(e);
    update();
}

画直线槽

 void MainWindow::drawLine(){
    ui->graphicsView->setScene(scene);
    line *item = new line;
    scene->addItem(item);
    qDebug() << "Line Created";
}

编辑:

void MainWindow::on_actionUndo_triggered()
    {
        undoView = new QUndoView(undoStack);
       ui->actionUndo= undoStack->createUndoAction(this, tr("&Undo"));
     ui->actionUndo->setShortcuts(QKeySequence::Undo);
}

您可以继续在应用程序中实现命令模式。这是在《Gang of Four Design Patterns: Elements of Reusable oriented Software》一书中找到的一个模式。我认为在这里可以找到比我所想的模式更好的解释:命令模式。

虽然本文的重点是游戏,但您也可以将其应用到您的代码中。好运!