`

Qt下hide()与close()相关的bug一例

 
阅读更多

本文是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父子与QT对象delete

    任何事情都有正反两面作用,这种机制看上去挺好,但是却会对很多Qt的初学者造成困扰,我经常给别人回答的问题是:1,new了一个Qt对象之后,在什么 情况下应该delete它?2,Qt的析构函数是不是有bug?3,为什么正常...

    Linux下Qt生成dump文件并定位bug(基于qBreakpad)

    Linux下Qt生成dump文件并定位bug(基于qBreakpad),博文参考:https://blog.csdn.net/zyhse/article/details/112852069

    Qt5.13.1串口Bug问题解决readyRead信号触发问题的dll与lib文件.7z

    分别将文件夹中的bin文件夹中的dll,和lib文件夹中的文件 对应复制覆盖到:Qt安装目录下(以默认路径为例),解决Qt5.13.1中QSerialPort 模块中 ReadyRead信号不触发的问题。 C:\Qt\Qt5.13.1\5.13.1\mingw73_64 ---...

    QT录屏源码 ,无BUG

    QT+C++写的一个window录屏源码,无bug,如果有问题可直接私聊

    QT实例100例代码

    QT实例100例全部代码,分为11章,每张的每个实例都有代码,自己运行时可以重新编译也可直接运行

    Qt5补丁 for VS2008(QTBUG-35980)

    QTBUG-35980的一个官方patch重新打包。Qt5源码在使用VS2008编译时qtwinextras模块报错的解决方案。Qt5源码编译参考:http://blog.csdn.net/phil2036/article/details/20409535

    Windows下Qt生成dump文件并定位bug(基于qBreakpad)-附件资源

    Windows下Qt生成dump文件并定位bug(基于qBreakpad)-附件资源

    QT-侧靠动画窗口-隐藏和显示窗体

    1、QT-侧靠动画窗口-隐藏和显示窗体 2、动画显示效果

    QT学习手册

    qt的小资料,关于Qt的简介,跟入门需要知道的相关常识

    Qt下实现WebServer的调用之qtsoap

    这是两个源码文件,一个是qtsoap.h,一个是qtsoap.cpp。这两个文件只要是实现在Qt下调用WebServer。使用时只需要把qtsoap.h和qtsoap.cpp文件添加到工程即可。

    QT中文参考手册(QT help)

    关于Qt Qt的版本 常见问题解答 Window系统特性注释 如何购买Qt 安装 如何学习Qt 教程一, 教程二 实例 循序渐进实例 白皮书 Qt 3.0的关键特征 修改历史 从Qt 2.x移植到Qt 3.x 简体中文汉化日志 Qt...

    基于Qt WebChannel实现QT与HTML页面通信

    最近,C++和WEB本地混合应用开发模式逐渐流行起来,个人也认为标记语言描述的界面是界面开发的一个发展趋势。...随着HTML5技术风生水起,Qt开发团队用近一年的时间开发了...本例实现基于Qt WebChannel 的QT与HTML页面通信

    QT 多窗口編程實例

    QT 多窗口編程實例QT 多窗口編程實例QT 多窗口編程實例QT 多窗口編程實例

    QT下获取网关地址(验证可用)

    QT下获取网关地址(验证可用)QT下获取网关地址(验证可用)QT下获取网关地址(验证可用)

    QT录屏功能,无bug版,可记录时间。

    QT录屏功能,利用avilib.h库默认路径保存生成的avi视频文件。加上记录时间的附加功能。

    QT经典教程_详细一步一步例子

    为了使更多的Qt初学者能尽快入门Qt,也为了Qt及Qt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列...

    Qt局域网聊天工具

    在上2次文章Qt学习之路_5(Qt TCP的初步使用) Qt学习之路_4(Qt UDP的初步使用) 中已经初步介绍了群聊功能和文件传输功能,这一节中主要在这个基础上加入一个私聊功能。  参考文献依旧是:《Qt及Qt Quick开发实战精解...

Global site tag (gtag.js) - Google Analytics