Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: folibis от Ноябрь 25, 2011, 05:23



Название: Динамическое меню в дереве
Отправлено: folibis от Ноябрь 25, 2011, 05:23
Есть дерево, QTreeView,по клику на элементе вызывается меню. Проблема в том что элементов несколько десятков и меню для каждого разное. в меню может быть и подменю.
Поэтому меню всякий раз создается заново
Что то в этом роде:
Код:
//тут создается меню
treeMenu = new QMenu(ui->objectTree);
connect(ui->objectTree,SIGNAL(customContextMenuRequested(const QPoint&)),this,SLOT(treePopupShow(const QPoint&)));

// клик на элементе
void MyProgram::treePopupShow(const QPoint & point) {
    QModelIndex index = ui->objectTree->indexAt(point);
    if(index.isValid())
    {
        TreeItem * item = static_cast<TreeItem *>(index.internalPointer());
        if(item)
        {
             treeMenu->clear();
             switch(item->getType())
             {
                    case NodeType1:
                    QMenu * submenu1 = treeMenu->addMenu(tr("submenu1")); // тут создается подменю
                    foreach(QString action,actionList1)
                    {
                        QAction * action = submenu1->addAction(action);
                        action->setData(action);
                    }
                    break;
                    case NodeType2:
                    QMenu * submenu2 = treeMenu->addMenu(tr("submenu2")); // тут создается подменю
                    foreach(QString action,actionList2)
                    {
                        QAction * action = submenu2->addAction(action);
                        action->setData(action);
                    }
                    break;
             }
              treeMenu->exec(ui->objectTree->viewport()->mapToGlobal(point));
        }
}

если делать treeMenu->clear(); перед созданием меню то это лишь очистит все actions, подменю не удалятся. Это потенциальная утечка памяти.
Как поступить, не знаю


Название: Re: Динамическое меню в дереве
Отправлено: GreatSnake от Ноябрь 25, 2011, 07:14
Сами тролли считают свою систему меню лёгкой и не заморачиваются и создают менюхи каждый раз непосредственно перед использованием.
Чего и вам советую)


Название: Re: Динамическое меню в дереве
Отправлено: folibis от Ноябрь 25, 2011, 07:49
Где? Дайте пример.
Это же потенциальная утечка памяти.


Название: Re: Динамическое меню в дереве
Отправлено: GreatSnake от Ноябрь 25, 2011, 07:54
Создавай на стеке, либо удаляй сразу после QMenu::exec().


Название: Re: Динамическое меню в дереве
Отправлено: folibis от Ноябрь 25, 2011, 12:51
Ок, нашел решение,вернее воспользовался советом GreatSnake.

Код:
treeMenu->exec(ui->objectTree->viewport()->mapToGlobal(point));
// это добавилось
submenu1->clear();
delete submenu1;
submenu2->clear();
delete submenu2;

Я почему то думал что exec() выполняется асинхронно