首页 文章

QMenu中QAction的所有权

提问于
浏览
4

我正在使用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,因为我将触发信号连接到几个插槽..这样工作正常但是当我调用clear时它应该删除菜单/操作项由QMenuBar包含..我正在检查任务管理器,内存使用量仍然很大..即使在:

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

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

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

2 回答

  • 5

    QMenuBar::clear 对你没有任何作用,因为正如@Dave Mateer所指出的那样,它只会删除 QMenuBar 中的动作并且不会删除它们 .

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

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

  • 4

    不,它们仍然存在于内存中,因为它们仅在删除菜单时被删除,并且仅在删除菜单(假设 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();
    }
    

相关问题