Russian Qt Forum
Сентябрь 24, 2024, 17:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое меню в дереве  (Прочитано 2502 раз)
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, подменю не удалятся. Это потенциальная утечка памяти.
Как поступить, не знаю
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 25, 2011, 07:14 »

Сами тролли считают свою систему меню лёгкой и не заморачиваются и создают менюхи каждый раз непосредственно перед использованием.
Чего и вам советую)
Записан

Qt 5.11/4.8.7 (X11/Win)
folibis
Гость
« Ответ #2 : Ноябрь 25, 2011, 07:49 »

Где? Дайте пример.
Это же потенциальная утечка памяти.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Ноябрь 25, 2011, 07:54 »

Создавай на стеке, либо удаляй сразу после QMenu::exec().
Записан

Qt 5.11/4.8.7 (X11/Win)
folibis
Гость
« Ответ #4 : Ноябрь 25, 2011, 12:51 »

Ок, нашел решение,вернее воспользовался советом GreatSnake.

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

Я почему то думал что exec() выполняется асинхронно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 22.