2012-01-30 2 views
3

Я использую Qt для создания базового GUI приложения, и у меня есть несколько вопросов .. Так что я создал графический интерфейс пользователя, он отлично работает, и я думал, что я хотел бы проверить что-то ..Владение QAction в QMenu

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(); 

Я использую QMenuBar класса QMainWindow и заполнить его с QMenu, которые также заполнены с QAction для Wich подключить сработавшей сигнал несколько слотов .. Это работает хорошо, но когда я вызываю ясно, что следует удалить пункты меню/действия, содержащиеся в QMenuBar .. Я проверяю диспетчер задач и использование памяти по-прежнему огромно .. Даже после:

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

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

Нельзя ли освободить всю память, используемую QMenus и QActions?

+0

для меня занимает около 4-5 секунд, чтобы очистить. Но панель меню очищена – Neox

+0

да, строка меню очищается, но память по-прежнему сохраняется. – elephantintheroom

ответ

3

QMenuBar::clear ничего не будет делать для вас, поскольку, как указал Mateer @ Dave, он удаляет только действия из QMenuBar и не удаляет их.

Кроме того, удаление списка действий из QMenuBar не приведет к удалению каждого QMenu.

Каждый QMenu у вас есть родительский член this который предположительно является вашим QMainWindow. Они будут удаляться только при удалении QMainWindow и не в строке меню. Вы можете изменить свой код так, чтобы вы родили каждый QMenu до QMenuBar, так что удаление строки меню удаляет меню (и их действия). Кроме того, вы можете держать указатели в каждом отдельном меню и удалять их вручную.

+0

Да, вы оба были правы .. Проблема в том, что родителем был QMainWindow, а не панель меню .. Спасибо! – elephantintheroom

3

Нет, они все еще существуют в памяти, потому что они будут удалены только тогда, когда меню удаляются, и меню удаляются только тогда, когда это (при условии 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(); 
} 
+0

Да, это интересно. Я не совсем уверен, почему это не сработает, но я отредактировал свой ответ с решением, которое, похоже, работает. –

+0

Нечеткое, новое решение тоже не сработало. – elephantintheroom

Смежные вопросы