Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Удаление пунктов закрытого меню (текучесть)


Автор: EGD 3.3.2012, 12:09
Добрый день,

возникла проблема с потреблением памяти и меню заполняющимся динамически в зависимости от условий.

При вызове меню размер выделенной для приложения памяти растет, что очевидно, но при закрытии меню память не высвобождается, что странно.

Как привильно создавать/удалять меню?

Код

void SpellChecker::showContextMenu(const QPoint& pt)
{
    FTextEdit = qobject_cast<QTextEdit *>(sender());
    QMenu* menu = FTextEdit->createStandardContextMenu();

    menu->addSeparator();
    menu->addMenu(FDictMenu);

    if (условие) {
        QMenu *sugMenu = suggestMenu("Text");

        if (!sugMenu->isEmpty()) {
          menu->addMenu(sugMenu);
          sugMenu->setAttribute(Qt::WA_DeleteOnClose, true);
        } else {
          delete sugMenu;
        }

        QAction *action = menu->addAction(tr("Add to dictionary"),this,SLOT(addWordToDict()));
        action->setProperty("word", AText);
        action->setParent(menu);
    }

    menu->setAttribute(Qt::WA_DeleteOnClose,true);
    menu->popup(FTextEdit->mapToGlobal(pt));
}


FDictMenu указать на QMenu, создается в конструкторе класса (является подменю и на протяжении существования экземпляра класса неизменно).

Функция suggestMenu(); возвращает указатель QMenu на подменю - всегда разное.
Код

QMenu* SpellChecker::suggestMenu(const QString &word){
    ...sgstions...
    QMenu *menu = new Menu();
    menu->setTitle(tr("Suggestions"));
    QAction *action;

    for (QList<QString>::iterator sgstion = sgstions.begin(); sgstion != sgstions.end(); sgstion++)
    {
        action = menu->addAction(*sgstion, this, SLOT(repairWord()));
        action->setProperty("word", *sgstion);
        action->setParent(menu);
    }

    return menu;
}


Используется Qt 4.8.0 (Linux).

Автор: borisbn 3.3.2012, 12:44
в конце функции showContextMenu нужно делать delete menu;
см. пример в http://qt-project.org/doc/qt-4.8/qlineedit.html#contextMenuEvent
в функции suggestMenu
Цитата(EGD @  3.3.2012,  12:09 Найти цитируемый пост)
QMenu *menu = new Menu();

наверное имелось в виду
Цитата
QMenu *menu = new QMenu();

?

Автор: EGD 3.3.2012, 13:13
Цитата
в конце функции showContextMenu нужно делать delete menu;
см. пример в http://qt-project.org/doc/qt-4.8/qlineedit.html#contextMenuEvent
в функции suggestMenu

хм... а почему тогда не помогает флаг QMenu::setAttribute(Qt::WA_DeleteOnClose,true);? по идее должен быть такой же эффект.

Цитата
наверное имелось в виду
Цитата
QMenu *menu = new QMenu();

?


да, конечно же.

p.S. просьба к модераторам плюсануть доброго человека.

Автор: alexvs11 3.3.2012, 13:37
Цитата(EGD @  3.3.2012,  13:13 Найти цитируемый пост)
хм... а почему тогда не помогает флаг QMenu::setAttribute(Qt::WA_DeleteOnClose,true);? по идее должен быть такой же эффект.

Цитата

Makes Qt delete this widget when the widget has accepted the close event (see QWidget::closeEvent()).

где у вас он приходит?

Автор: EGD 3.3.2012, 13:54
Цитата(alexvs11 @ 3.3.2012,  14:37)
Цитата(EGD @  3.3.2012,  13:13 Найти цитируемый пост)
хм... а почему тогда не помогает флаг QMenu::setAttribute(Qt::WA_DeleteOnClose,true);? по идее должен быть такой же эффект.

Цитата

Makes Qt delete this widget when the widget has accepted the close event (see QWidget::closeEvent()).

где у вас он приходит?

я думал при закрытии (когда пропадает) popup меню, нет?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)