我使用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使用的所有内存吗?
答案 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
,以便删除菜单栏会删除菜单(及其操作)。或者,您可以保持指向每个单独菜单的指针并手动删除它们。