QMenu中QAction的所有权

时间:2012-01-30 20:40:25

标签: c++ qt user-interface memory-management

我使用Qt为应用程序构建基本GUI,我有几个问题.. 所以我创建了GUI,它工作正常,我想我会检查一下..

for(int i=0; i < 100000; i++)
{
    menu = new QMenu(this);
    act = new QAction("About", menu);
    menu->addAction(act);
    connect(act, SIGNAL(triggered()), this, SLOT(slotHelpAbout()));
    menuBar()->addMenu(menu)->setText("Help");
}
menuBar()->clear();

我使用QMainWindow类的QMenuBar并用QMenu填充它们也填充了QAction,因为我将触发信号连接到几个插槽..这样工作正常但是当我打电话清除它应该删除菜单/ QMenuBar包含的操作项..我正在检查任务管理器,内存使用量仍然很大.. 即便如此:

    QList<QAction*> lst = menuBar()->actions();

    for(int i=0;i < lst.length(); i++)
    {
        delete lst.at(i);
    }

不应释放QMenus和QActions使用的所有内存吗?

2 个答案:

答案 0 :(得分:5)

不,它们仍然存在于内存中,因为它们只会在删除菜单时被删除,菜单仅在时被删除(假设QMainWindow)被删除。致电clear不会删除它们。

clear不执行此操作的原因是因为(除其他外)它支持如下情况:您已命名变量引用QAction实例,并且您想要重新排列它们在你的菜单上。您拨打clear将其全部删除,然后按照您希望的顺序使用相同的操作拨打addAction

如果要直接删除它们,只需删除菜单栏即可。这将以递归方式删除菜单栏中的所有菜单和操作。如果menuBar()不存在,则会自动创建一个新的,因此您甚至不必担心这一点。

#include <QtGui>

int main(int argc, char **argv) {
  QApplication app(argc, argv);

  QMainWindow m;

  QMenu *menu = m.menuBar()->addMenu("test");
  for (int i = 0; i < 30000; ++i) {
    menu->addAction(QString::number(i));  // memory going up, up, up...
  }

  delete m.menuBar();  // frees memory

  menu = m.menuBar()->addMenu("test2");  // Automatically creates new menu bar
  menu->addAction("test 2 action");

  m.show();

  return app.exec();
}

答案 1 :(得分:4)

QMenuBar::clear对您无能为力,因为正如@Dave Mateer所指出的那样,它只会删除QMenuBar中的操作,并且不会删除它们。

此外,从QMenuBar删除操作列表不会导致每个QMenu本身被删除。

您拥有的每个QMenu都是this的父级,大概是您的QMainWindow。只有当您删除QMainWindow的菜单栏时,才会删除它们。您可以更改代码,以便将每个QMenu设为QMenuBar,以便删除菜单栏会删除菜单(及其操作)。或者,您可以保持指向每个单独菜单的指针并手动删除它们。