本文是QMainWindow上下文菜单内存泄露(QTBUG)一文
的续篇,所以你很可能需要先看上文。
前传
问题起源于:QTBUG-7902
在Qt 4.6下,下面的小程序在显示上下文菜单的情况下会导致程序崩溃。
#include <QApplication>
#include <QTextEdit>
#include <QTimer>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QTextEdit *te = new QTextEdit;
te->show();
te->setText("right click here now");
QTimer ti;
te->connect(&ti, SIGNAL(timeout()), te, SLOT(deleteLater()));
ti.start(3000);
return qApp->exec();
}
这个问题是由于QMenu::exec()开启的局部事件循环造成的副作用。【至于局部事件循环可能造成的各种潜在问题,可访问乱谈Qt事件循环嵌套】
2010.2.9日的 b7af368e86874d71ffc9071c9ef009814d6a3467 修复这个问题
修复
采用QMenu::popup() 取代 QMenu::exec()
这也是我们在QMainWindow上下文菜单内存泄露(QTBUG)一文中看到的
QMainWindow的上下文菜单之所以那么改动的原因。
内存泄漏
当看了 b7af368e86874d71ffc9071c9ef009814d6a3467 以后,我发现这个问题远比我想想的严重,除了QMainWindow之外,QTextEdit/QPlainTextEdit/QLineEdit/QMessageBox 等都会存在这个问题。
于是提交了 QTBUG-22817
如何修复?
也就是我们在QMainWindow上下文菜单内存泄露(QTBUG)一文提到的,只需要改动一行代码即可:
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -500,7 +500,7 @@ void QMenuPrivate::hideMenu(QMenu *menu, bool justRegi
menu->blockSignals(false);
#endif // QT_NO_EFFECTS
if (!justRegister)
- menu->hide();
+ menu->close();
}
参考
分享到:
相关推荐
任何事情都有正反两面作用,这种机制看上去挺好,但是却会对很多Qt的初学者造成困扰,我经常给别人回答的问题是:1,new了一个Qt对象之后,在什么 情况下应该delete它?2,Qt的析构函数是不是有bug?3,为什么正常...
Linux下Qt生成dump文件并定位bug(基于qBreakpad),博文参考:https://blog.csdn.net/zyhse/article/details/112852069
分别将文件夹中的bin文件夹中的dll,和lib文件夹中的文件 对应复制覆盖到:Qt安装目录下(以默认路径为例),解决Qt5.13.1中QSerialPort 模块中 ReadyRead信号不触发的问题。 C:\Qt\Qt5.13.1\5.13.1\mingw73_64 ---...
QT+C++写的一个window录屏源码,无bug,如果有问题可直接私聊
QT实例100例全部代码,分为11章,每张的每个实例都有代码,自己运行时可以重新编译也可直接运行
QTBUG-35980的一个官方patch重新打包。Qt5源码在使用VS2008编译时qtwinextras模块报错的解决方案。Qt5源码编译参考:http://blog.csdn.net/phil2036/article/details/20409535
Windows下Qt生成dump文件并定位bug(基于qBreakpad)-附件资源
1、QT-侧靠动画窗口-隐藏和显示窗体 2、动画显示效果
qt的小资料,关于Qt的简介,跟入门需要知道的相关常识
这是两个源码文件,一个是qtsoap.h,一个是qtsoap.cpp。这两个文件只要是实现在Qt下调用WebServer。使用时只需要把qtsoap.h和qtsoap.cpp文件添加到工程即可。
关于Qt Qt的版本 常见问题解答 Window系统特性注释 如何购买Qt 安装 如何学习Qt 教程一, 教程二 实例 循序渐进实例 白皮书 Qt 3.0的关键特征 修改历史 从Qt 2.x移植到Qt 3.x 简体中文汉化日志 Qt...
最近,C++和WEB本地混合应用开发模式逐渐流行起来,个人也认为标记语言描述的界面是界面开发的一个发展趋势。...随着HTML5技术风生水起,Qt开发团队用近一年的时间开发了...本例实现基于Qt WebChannel 的QT与HTML页面通信
QT 多窗口編程實例QT 多窗口編程實例QT 多窗口編程實例QT 多窗口編程實例
QT下获取网关地址(验证可用)QT下获取网关地址(验证可用)QT下获取网关地址(验证可用)
QT录屏功能,利用avilib.h库默认路径保存生成的avi视频文件。加上记录时间的附加功能。
为了使更多的Qt初学者能尽快入门Qt,也为了Qt及Qt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列...
在上2次文章Qt学习之路_5(Qt TCP的初步使用) Qt学习之路_4(Qt UDP的初步使用) 中已经初步介绍了群聊功能和文件传输功能,这一节中主要在这个基础上加入一个私聊功能。 参考文献依旧是:《Qt及Qt Quick开发实战精解...