本文是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();
}
参考
分享到:
相关推荐
在Linux环境下,开发Qt应用程序时,遇到bug是常有的事情。为了有效地调试和修复这些问题,开发者需要有一种方式来记录程序崩溃时的现场信息,这就是dump文件的作用。dump文件包含了程序运行时内存的状态,通过分析它...
QT实例100例代码是QT编程学习的重要资源,它涵盖了广泛的QT应用实践,旨在帮助开发者深入理解并熟练掌握QT库的功能和用法。QT是一个跨平台的应用程序开发框架,广泛应用于GUI(图形用户界面)设计,同时也支持命令行...
QT录屏源码是使用C++编程语言与QT框架结合实现的一款Windows平台的屏幕录制工具。QT(Qt)是一个开源的跨平台应用程序开发框架,它提供了丰富的API和工具,使得开发者能够创建美观、高效的桌面及移动应用。在这个...
分别将文件夹中的bin文件夹中的dll,和lib文件夹中的文件 对应复制覆盖到:Qt安装目录下(以默认路径为例),解决Qt5.13.1中QSerialPort 模块中 ReadyRead信号不触发的问题。 C:\Qt\Qt5.13.1\5.13.1\mingw73_64 ---...
在这个特定的QT录屏功能实现中,开发者使用了`avilib.h`库,这是一个与AVI文件处理相关的库。AVI(Audio Video Interleave)是微软推出的一种音频视频交错格式,常用于存储视频数据。通过这个库,我们可以将捕获到的...
《FFMPEG与Qt结合构建视频播放器:深入解析与BUG修复》 在现代软件开发中,尤其是在多媒体应用领域,FFMPEG与Qt的结合使用是常见且强大的工具。本项目"VideoPlayer_7"正是基于这样的技术栈,旨在实现一个能够解码...
在Qt环境下,开发人员经常需要与各种网络服务进行交互,比如Web API或远程服务器。`Qtsoap`就是一种用于在Qt应用程序中实现SOAP(简单对象访问协议)通信的工具,它使得Qt应用能够轻松地调用WebServer上的服务。本文...
标题中的“优质Qt资源”指的是高质量的Qt相关开发资源,这些资源可能是开源的代码示例、教程或者项目模板,可以帮助开发者学习和理解Qt的各种功能和最佳实践。这个资源集合特别强调了它包含超过100个demo,这意味着...
QT框架是Qt公司开发的一种跨平台的应用程序开发框架,它被广泛用于创建桌面、移动以及嵌入式平台上的图形用户界面。在QT中,我们可以通过使用QGraphicsView和QGraphicsScene来实现复杂的动画效果,包括侧靠动画窗口...
QTBUG-35980的一个官方patch重新打包。Qt5源码在使用VS2008编译时qtwinextras模块报错的解决方案。Qt5源码编译参考:http://blog.csdn.net/phil2036/article/details/20409535
在Ubuntu操作系统中,Qt是一个非常强大的C++图形用户界面应用程序开发框架,广泛应用于桌面和移动平台。使用Qt进行串口操作可以实现与硬件设备的通信,例如读取传感器数据、控制电子设备等。本文将详细介绍如何在...
在Qt编程中,创建一个右下角弹出框可以实现应用程序的通知功能,使得用户在不离开当前工作界面的情况下,能够接收到重要的信息提示。本文将详细介绍如何使用Qt库来实现这个功能,以及相关的编程技巧。 首先,Qt是一...
Windows下Qt生成dump文件并定位bug(基于qBreakpad)-附件资源
在本文中,我们将深入探讨如何在Qt 5框架下与PostgreSQL(pgsql)数据库进行通信。Qt是一个跨平台的应用程序开发框架,而PostgreSQL则是一个强大的开源对象关系数据库系统。结合两者,我们可以构建高效、可靠的...
Qt提供了QDir类来处理与目录和文件相关的操作。以下是对这个知识点的详细说明: 首先,我们需要理解QDir类。QDir是Qt中的一个核心类,它提供了对文件系统目录的操作,如读取、遍历、创建和删除目录以及文件。在`Qt...
信号(Signal)与槽(Slot)是Qt的核心特性,它们提供了一种安全、类型安全的方式来连接对象,使得当一个对象的某个事件发生时,可以触发另一个对象的方法执行。这种机制遵循了模型-视图-控制器(MVC)的设计模式,...
它提供了一系列的方法,如`open()`用于打开串口,`close()`用于关闭串口,`write()`用于向串口发送数据,`readAll()`用于读取串口接收到的所有数据。此外,`QSerialPortInfo`类可以用来获取可用串口的信息,如端口号...
Qt Creator是一款强大的跨平台集成开发环境(IDE),广泛用于C++和Qt应用程序的开发。为了方便中国用户使用,Qt Creator提供了汉化包,使其界面能够显示为中文。以下是一个详细的Qt Creator汉化步骤,基于描述中的...