Qt:删除MainWindow后QMenu似乎没有被删除

Posted

技术标签:

【中文标题】Qt:删除MainWindow后QMenu似乎没有被删除【英文标题】:Qt: QMenu seems to not be deleted after deleting MainWindow 【发布时间】:2014-05-18 10:32:21 【问题描述】:

在 MainWindow 的构造函数中,我有一段代码:

QMenu * filemenu = this->menuBar()->addMenu(tr("File"));
QAction * openButton = new QAction(tr("Open"), this);
connect(openButton, SIGNAL(triggered()), this, SLOT(input()));
filemenu->addAction(openButton);

在我进行内存检查之前,一切似乎都很好。 Valgrind 似乎在说这里存在内存泄漏。 QMenu 不应该在 MainWindow 被删除之前自动删除吗?我尝试记住指向文件菜单的指针并在 MainWindow 析构函数中手动删除它,但它没有改变任何东西。有谁知道我做错了什么?

【问题讨论】:

This 说它不应该发生。您能否显示您解释的 valgrind 输出?你确定主窗口析构函数执行了吗? 这里是输出:pastebin.com/RPgTa0Ft。是的,我很确定,因为我告诉他用 qDebug() 发送一些废话。 Here is 另一个育儿。您使用的是哪个 Qt 版本以及哪个平台? 我使用的系统是 Ubuntu。根据 Creator 的说法,我使用的版本是“Qt version 5.2.1 for Desktop”。 你能把一个槽连接到你的 QMenu 实例(filemenu)的destroy() 信号上,然后用qDebug() 打印出一些东西吗?它是否会为主窗口销毁而打印?尝试以某种方式在主窗口之外执行此操作。 【参考方案1】:

QMenu不应该在MainWindow被删除之前自动删除吗?

你可以将一个槽连接到你的 QMenu 实例(filemenu)的destroyed() 信号,然后用qDebug() 打印出一些东西。如果为主窗口销毁打印了这意味着调用了析构函数,即被删除。

...
   connect(myMenuPointer, SIGNAL(destroyed()), receiverPointer, SLOT(test()));
...

MyClass::test()

    qDebug() << "My menu deleted automatically";

有时,如果下面的某些东西泄漏了 glibc 等内存,则 valgrind 在 Qt 应用程序中检测到内存泄漏。可能是这样,但您的问题的答案是 QMenu 将被自动删除。

【讨论】:

以上是关于Qt:删除MainWindow后QMenu似乎没有被删除的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt Designer 中删除 QMenu 分隔符?

Qt5-控件-QMenu,QMenuBar-菜单栏详解-菜单热键-菜单校验功能

如何将 QMenu 项目移动到 QMenuBar 的右上角

QT:QActionGroup加入QMenu后,谁是QActionGroup成员的父母?

Qt 中如何隐藏 QMenu

QPushButton.setMenu (self, QMenu menu) 使用从 Qt Designer 生成的代码