我正在使用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 回答
QMenuBar::clear
对你没有任何作用,因为正如@Dave Mateer所指出的那样,它只会删除QMenuBar
中的动作并且不会删除它们 .此外,从
QMenuBar
删除操作列表不会导致删除每个QMenu
本身 .您拥有的每个
QMenu
都是this
的父级,大概是您的QMainWindow
. 它们只会在您删除QMainWindow
而不是它的菜单栏时被删除 . 您可以更改代码,以便将每个QMenu
生成QMenuBar
,以便删除菜单栏删除菜单(及其操作) . 或者,您可以保持指向每个单独菜单的指针并手动删除它们 .不,它们仍然存在于内存中,因为它们仅在删除菜单时被删除,并且仅在删除菜单(假设
QMainWindow
)时才删除菜单 . 调用clear
不会删除它们 .clear
不执行此操作的原因是因为(除其他外)它支持如下情况:您已命名变量引用QAction
实例,并且您想要在菜单上重新排列它们 . 您调用clear
将它们全部删除,然后按照您希望的顺序使用相同的操作调用addAction
.如果要直接删除它们,只需删除菜单栏即可 . 这将以递归方式删除菜单栏中的所有菜单和操作 . 如果
menuBar()
不存在,则自动创建一个新的,因此您甚至不必担心 .