`
gaofen100
  • 浏览: 1227835 次
文章分类
社区版块
存档分类
最新评论

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();
 }

参考

分享到:
评论

相关推荐

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

    在Linux环境下,开发Qt应用程序时,遇到bug是常有的事情。为了有效地调试和修复这些问题,开发者需要有一种方式来记录程序崩溃时的现场信息,这就是dump文件的作用。dump文件包含了程序运行时内存的状态,通过分析它...

    QT实例100例代码

    QT实例100例代码是QT编程学习的重要资源,它涵盖了广泛的QT应用实践,旨在帮助开发者深入理解并熟练掌握QT库的功能和用法。QT是一个跨平台的应用程序开发框架,广泛应用于GUI(图形用户界面)设计,同时也支持命令行...

    QT录屏源码 ,无BUG

    QT录屏源码是使用C++编程语言与QT框架结合实现的一款Windows平台的屏幕录制工具。QT(Qt)是一个开源的跨平台应用程序开发框架,它提供了丰富的API和工具,使得开发者能够创建美观、高效的桌面及移动应用。在这个...

    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录屏功能实现中,开发者使用了`avilib.h`库,这是一个与AVI文件处理相关的库。AVI(Audio Video Interleave)是微软推出的一种音频视频交错格式,常用于存储视频数据。通过这个库,我们可以将捕获到的...

    VideoPlayer_7(FFMPEG Qt视频播放器之BUG修复)_qt+ffmpeg_QT_QTqtffmpeg_QT视频

    《FFMPEG与Qt结合构建视频播放器:深入解析与BUG修复》 在现代软件开发中,尤其是在多媒体应用领域,FFMPEG与Qt的结合使用是常见且强大的工具。本项目"VideoPlayer_7"正是基于这样的技术栈,旨在实现一个能够解码...

    Qt下实现WebServer的调用之qtsoap

    在Qt环境下,开发人员经常需要与各种网络服务进行交互,比如Web API或远程服务器。`Qtsoap`就是一种用于在Qt应用程序中实现SOAP(简单对象访问协议)通信的工具,它使得Qt应用能够轻松地调用WebServer上的服务。本文...

    优质Qt资源,Qt编写的一些开源的demo(100个以上),支持Qt4、Qt5、Qt6,支持任意系统

    标题中的“优质Qt资源”指的是高质量的Qt相关开发资源,这些资源可能是开源的代码示例、教程或者项目模板,可以帮助开发者学习和理解Qt的各种功能和最佳实践。这个资源集合特别强调了它包含超过100个demo,这意味着...

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

    QT框架是Qt公司开发的一种跨平台的应用程序开发框架,它被广泛用于创建桌面、移动以及嵌入式平台上的图形用户界面。在QT中,我们可以通过使用QGraphicsView和QGraphicsScene来实现复杂的动画效果,包括侧靠动画窗口...

    Qt5补丁 for VS2008(QTBUG-35980)

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

    utuntu下用QT串口操作

    在Ubuntu操作系统中,Qt是一个非常强大的C++图形用户界面应用程序开发框架,广泛应用于桌面和移动平台。使用Qt进行串口操作可以实现与硬件设备的通信,例如读取传感器数据、控制电子设备等。本文将详细介绍如何在...

    Qt 右下角弹出框

    在Qt编程中,创建一个右下角弹出框可以实现应用程序的通知功能,使得用户在不离开当前工作界面的情况下,能够接收到重要的信息提示。本文将详细介绍如何使用Qt库来实现这个功能,以及相关的编程技巧。 首先,Qt是一...

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

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

    Linux下在QT中访问pgsql数据库

    在本文中,我们将深入探讨如何在Qt 5框架下与PostgreSQL(pgsql)数据库进行通信。Qt是一个跨平台的应用程序开发框架,而PostgreSQL则是一个强大的开源对象关系数据库系统。结合两者,我们可以构建高效、可靠的...

    Qt删除一个目录下所有文件和文件夹

    Qt提供了QDir类来处理与目录和文件相关的操作。以下是对这个知识点的详细说明: 首先,我们需要理解QDir类。QDir是Qt中的一个核心类,它提供了对文件系统目录的操作,如读取、遍历、创建和删除目录以及文件。在`Qt...

    Qt 两个窗口相互切换

    信号(Signal)与槽(Slot)是Qt的核心特性,它们提供了一种安全、类型安全的方式来连接对象,使得当一个对象的某个事件发生时,可以触发另一个对象的方法执行。这种机制遵循了模型-视图-控制器(MVC)的设计模式,...

    Qt串口12313123123_串口协议解析_qt串口_QT_QT协议解析_Qt串口

    它提供了一系列的方法,如`open()`用于打开串口,`close()`用于关闭串口,`write()`用于向串口发送数据,`readAll()`用于读取串口接收到的所有数据。此外,`QSerialPortInfo`类可以用来获取可用串口的信息,如端口号...

    [Qt]Qt Creator汉化方法 qt汉化包

    Qt Creator是一款强大的跨平台集成开发环境(IDE),广泛用于C++和Qt应用程序的开发。为了方便中国用户使用,Qt Creator提供了汉化包,使其界面能够显示为中文。以下是一个详细的Qt Creator汉化步骤,基于描述中的...

Global site tag (gtag.js) - Google Analytics