Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在QGraphicscene上逐个撤消或删除行_Qt_Undo_Qgraphicsscene - Fatal编程技术网

Qt 在QGraphicscene上逐个撤消或删除行

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

我有一个QGraphicsView子类,用于加载图像。然后,用户可以通过单击并拖动在该图像上绘制一些线

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框架的内置功能。

是的,我知道。但是我想要一件非常简单的事情。我很好奇为什么它不起作用?你跟踪错了东西。我已经扩展了我的答案。使用撤销框架可能比您想象的要简单得多。它还将防止您的
选项卡视图
类成为“是”,我知道这一点。但是我想要一件非常简单的事情。我很好奇为什么它不起作用?你跟踪错了东西。我已经扩展了我的答案。使用撤销框架可能比您想象的要简单得多。它还将防止您的
选项卡视图
类成为