首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Qt撤消框架的问题示例:添加/删除项目

Qt撤消框架的问题示例:添加/删除项目
EN

Stack Overflow用户
提问于 2017-01-15 01:41:50
回答 1查看 227关注 0票数 0

我使用QT undo框架示例作为参考,以便在我的工具中实现此功能。然而,它调用项目的析构函数的方式似乎有一个bug。

据我所知,当项目在场景中时,QGraphicsScene将承担项目的所有权。但是,这两个撤消对象:当从场景中移除这些项目时,AddCommand和RemoveCommand应取得这些项目的所有权。

在Qt undo框架示例中,只有AddCommand尝试删除其析构函数中的对象,但如果该项目仍在场景中,则不会执行此操作。

代码语言:javascript
运行
AI代码解释
复制
AddCommand::~AddCommand()
{
    if (!myDiagramItem->scene())
        delete myDiagramItem;
}

在这种情况下,如果我们在相应的AddCommand对象离开堆栈之后从场景中删除该项(当使用撤消限制时),该项将永远不会被再次删除,因为RemoveCommand析构函数不会这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-15 01:41:50

我在AddCommand和RemoveCommand类中都使用了一个标志来修复它。它通知此对象何时应负责项目销毁。当他们从场景中移除项目时,我将这个标志设置为true,并且在调用项目的析构函数之前,我在撤销对象析构函数中测试了这个标志:

代码语言:javascript
运行
AI代码解释
复制
AddCommand::AddCommand(QGraphicsScene *scene, DraftGraphicItem* item, QUndoCommand *parent):
    scene(scene), item(item), QUndoCommand(parent){
    setText("Add item to scene");
}

AddCommand::~AddCommand(){
    if(isItemOwner)
        delete item;
}

void AddCommand::undo(){
    Q_ASSERT(item->scene()); 
    scene->removeItem(item);
    isItemOwner = false;
}

void AddCommand::redo(){
    Q_ASSERT(!item->scene()); 
    scene->addItem(item);
    isItemOwner = true;
}

RemoveCommand也是如此,只需颠倒redo()和undo()方法即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41656969

复制
相关文章
Qt树形控件QTreeView使用1——节点的添加删除操作[通俗易懂]
QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点)。
全栈程序员站长
2022/09/06
6.7K0
Qt 添加菜单及菜单的事件响应(完整的示例)
Qt添加菜单有两种方法,一是用代码直接手动添加,二是在Qtdesigner中在界面上直接添加。
zls365
2020/08/19
7.4K0
Qt 添加菜单及菜单的事件响应(完整的示例)
JavaScript | 数组的splice()方法,向/从数组添加/删除项目,并返回删除的项目
JavaScript代码: /* * splice() 方法向/从数组添加/删除项目,并返回删除的项目。 * 注释:splice() 方法会改变原始数组。 * 语法:array.splice(index, howmany, item1, ....., itemX) * index:必需。整数,指定在什么位置添加/删除项目,使用负值指定从数组末尾开始的位置。 * howmany:可选。要删除的项目数。如果设置为 0,则不会删除任何项目。 * item1, ...
倾盖
2022/08/16
3.4K0
JavaScript | 数组的splice()方法,向/从数组添加/删除项目,并返回删除的项目
如何在运行时动态添加和删除Qt Widgets
在油管上看到一篇关于Qt的视频:[How to Add & Remove Qt Widgets Dynamically at Runtime](https://www.youtube.com/watc
ccf19881030
2021/06/29
4K0
Qt官方示例-摆动的文字
QBasicTimer是计时器的低级类。与QTimer不同,QBasicTimer不会从QObject继承。它不会在经过一定时间后发出timeout()信号,而是将QTimerEvent发送到我们选择的QObject。这使QBasicTimer成为QTimer的更轻量级替代。主要用于高度优化或性能要求较高的应用程序(例如嵌入式应用程序)。
Qt君
2020/02/24
1.8K0
Qt官方示例-Http
通过get接口对url资源下载,并显示下载进度。 0x00 Http请求 void HttpWindow::startRequest(const QUrl &requestedUrl) { .
Qt君
2019/11/04
9310
Git 撤消操作
任何时候,你都有可能需要撤消刚才所做的某些操作。接下来,我们会介绍一些基本的撤消操作相关的命令。请注意,有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果。
看、未来
2022/05/06
4530
Qt编写地图综合应用15-添加删除清空重置点
在地图应用的相关项目中,在地图上标识一些设备点,并对点进行交互这个功能用的最多的,于是需要一套机制可以动态的添加、删除、清空、重置,重置的意思是将地图中的所有点的经纬度重新设置,其实就是先清空然后挨个重新添加所有点的信息,JS的异步交互功能非常强大,直接执行对应的JS函数就可以,没有必要刷新网页,最开始很多年前做的时候还不会JS,那时候想的最糟糕的办法就是写死在代码中,这样每次变动需要重新加载网页,后面发现那真是糟糕的办法,既然有异步刷新的办法为何不用呢,自从学会了JS异步刷新方法以后,索性将各种方法都改成了JS函数,传入对应的参数即可,参数尽可能的考虑到已知的各种各样的情况,方便用户自己添加。
feiyangqingyun
2020/04/18
9110
Qt编写地图综合应用15-添加删除清空重置点
【Qt】打开现有 Qt 项目 ( 打开已存在的项目 | 运行打开的项目 )
Qt 环境安装参考 【Qt】Qt 开发环境安装 ( Qt 版本 5.14.2 | Qt 下载 | Qt 安装 ) 博客 ;
韩曙亮
2023/03/29
6.3K0
【Qt】打开现有 Qt 项目 ( 打开已存在的项目 | 运行打开的项目 )
QListWidget添加删除
qt和vc一样自由线程模式,线程间可以访问ui,但线程间访问qt内部封装问题,导致很多一样,可以使用信号和槽线程间传递数据,避免异常
sofu456
2020/08/11
1K0
HTML购物车示例(勾选、删除、添加和结算功能)
以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。
德宏大魔王
2023/08/08
1K0
HTML购物车示例(勾选、删除、添加和结算功能)
Git示例教程 - 同步本地分支的添加删除状态到远程(或反之)
为了方便测试,我们先在GitHub上创建一个名为git-test-repo的仓库,然后将其克隆到本地,之后,我们再用相应的命令创建一个测试分支,并将其同步到远端,具体命令如下:
KINGYT
2019/10/31
1.3K0
新建gradle项目 并添加springboot框架支持
参考文档:http://projects.spring.io/spring-boot/#quick-start
week
2018/08/24
6740
新建gradle项目 并添加springboot框架支持
点击加载更多

相似问题

撤消删除实体框架

12

Qt安装程序框架撤消Mkdir操作

30

无法理解Qt中的撤消重做框架

10

Qt示例项目不运行

11

Qt OpenGL图形用户界面:添加和撤消Qt按钮

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档