在Qt中撤消重做
Undo Redo in Qt
我在我的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》一书中找到的一个模式。我认为在这里可以找到比我所想的模式更好的解释:命令模式。
虽然本文的重点是游戏,但您也可以将其应用到您的代码中。好运!
相关文章:
- 在Qt中复制,剪切,粘贴,重命名,撤消和重做
- 如何撤消此代码上的 cin 重定向?
- Qt 撤消/重做和线程
- 在 QTextEdit 中撤消/重做
- 使用最小样板保存/加载+撤消/重做机制
- QT:QSplitter,重做尺寸
- 撤消后触发重做
- 撤消/重做的命令模式:何时不合并撤消命令
- 重做字符是未声明的,但它被声明了
- 撤消/重做时释放内存时出现问题
- 可视化C++撤消和重做操作
- 使用链表撤消/重做
- 如何覆盖撤销/重做在QPlainTextEdit
- 在Qt中撤消重做
- 在painter程序中实现撤消重做
- 撤销/重做使用列表的shared_ptr
- 让线程按顺序重做打印函数
- 在一次调用中重置使用 iomanip 所做的所有更改的类:setprecision、setfill 和标志
- 使用 dup2 撤消标准输出的重定向
- 你如何只分配给一个指针在c#为我的撤消重做类