Qt 在QGraphicscene上逐个撤消或删除行
我有一个QGraphicsView子类,用于加载图像。然后,用户可以通过单击并拖动在该图像上绘制一些线Qt 在QGraphicscene上逐个撤消或删除行,qt,undo,qgraphicsscene,Qt,Undo,Qgraphicsscene,我有一个QGraphicsView子类,用于加载图像。然后,用户可以通过单击并拖动在该图像上绘制一些线 void TabView::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton) { scene->addLine(line); } } 我添加了撤销功能,如下所示: void TabView::mousePressEvent(QMouseEvent
void TabView::mousePressEvent(QMouseEvent *event){
if (event->button() == Qt::LeftButton) {
scene->addLine(line);
}
}
我添加了撤销功能,如下所示:
void TabView::mousePressEvent(QMouseEvent *event){
if (event->button() == Qt::LeftButton) {
lineList<<line;
scene->addLine(lineList.last());
}
}
void TabView::keyPressEvent(QKeyEvent * event){
int key = event->key();
switch(key){
case Qt::Key_Delete:
{
lineList.removeLast();
foreach(QLineF line, lineList){
scene->addLine(line);
}
scene->update();
break;
}
}
}
但这也不起作用
我的问题是:如何在QGraphicscene中逐个撤销或删除项目
编辑:
看看这个:
case Qt::Key_Delete:
{
itemList = scene->items();
itemList.removeLast();
foreach(QGraphicsItem *item, itemList){
scene->addItem(item);
}
scene->update();
break;
}
它希望它能起作用,但事实并非如此
我真想知道为什么它不起作用 在您的删除代码中:
case Qt::Key_Delete:
QGraphicsLineItem *item = new QGraphicsLineItem(lineList.last());
scene->removeItem(item);
scene->update();
break;
您正在创建一个新的QGraphicsLineItem对象。该对象在场景中不存在,因此执行scene->removietem(item)
将不起任何作用
您需要跟踪添加到场景中的所有QGraphicsLineItem
对象,而不是用于创建它们的QLineF
对象
您是否考虑过在删除代码中使用?:
case Qt::Key_Delete:
QGraphicsLineItem *item = new QGraphicsLineItem(lineList.last());
scene->removeItem(item);
scene->update();
break;
您正在创建一个新的QGraphicsLineItem对象。该对象在场景中不存在,因此执行scene->removietem(item)
将不起任何作用
您需要跟踪添加到场景中的所有QGraphicsLineItem
对象,而不是用于创建它们的QLineF
对象
您是否考虑过使用?如前所述,Qt Undo框架最适合您 然而,若您想要实现自己的撤销/重做功能,那个么您必须维护撤销和重做操作的堆栈列表 例如,可以有一个名为listUndo的堆栈和一个名为listRedo的堆栈
- 对于用户执行的每一行添加操作或任何其他操作,请在listUndo堆栈上按下该操作。另外,请记住在用户执行的每个操作上清除listRedo堆栈
- 如果用户按下“撤消”,则从listUndo堆栈中弹出最后一个操作,撤消该操作并将该操作推送到listRedo堆栈上
- 如果用户按下“重做”,则弹出listRedo堆栈中撤消的最后一个操作,重做该操作并将该操作推送到listUndo堆栈上
当然,正如我所说,上面的内容似乎有点棘手,而且容易出现错误,因此最好使用Qt Undo框架的内置功能。正如前面所建议的,Qt Undo框架应该最适合您 然而,若您想要实现自己的撤销/重做功能,那个么您必须维护撤销和重做操作的堆栈列表 例如,可以有一个名为listUndo的堆栈和一个名为listRedo的堆栈
- 对于用户执行的每一行添加操作或任何其他操作,请在listUndo堆栈上按下该操作。另外,请记住在用户执行的每个操作上清除listRedo堆栈
- 如果用户按下“撤消”,则从listUndo堆栈中弹出最后一个操作,撤消该操作并将该操作推送到listRedo堆栈上
- 如果用户按下“重做”,则弹出listRedo堆栈中撤消的最后一个操作,重做该操作并将该操作推送到listUndo堆栈上
当然,正如我所说,上面的问题似乎有点棘手,而且容易出现错误,所以最好使用Qt Undo框架的内置功能。是的,我知道。但是我想要一件非常简单的事情。我很好奇为什么它不起作用?你跟踪错了东西。我已经扩展了我的答案。使用撤销框架可能比您想象的要简单得多。它还将防止您的
选项卡视图
类成为“是”,我知道这一点。但是我想要一件非常简单的事情。我很好奇为什么它不起作用?你跟踪错了东西。我已经扩展了我的答案。使用撤销框架可能比您想象的要简单得多。它还将防止您的选项卡视图
类成为