Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: radislav72 от Июль 06, 2014, 11:38



Название: Динамическое формирование меню
Отправлено: radislav72 от Июль 06, 2014, 11:38
Здравствуйте!

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


Название: Re: Динамическое формирование меню
Отправлено: Bepec от Июль 06, 2014, 11:45
Вы сами его вызываете, вот в том месте и меняйте.
Для виджета это contextMenuEvent к примеру.


Название: Re: Динамическое формирование меню
Отправлено: radislav72 от Июль 06, 2014, 11:53
Не, я его привязал к кнопке и меню появляется при ее нажатии автоматически:

Код:
QMenu* mnOperations = new QMenu(this);
    mnOperations->addAction(QIcon(":/images/table_run.png"), tr("Change currency: total"), this, SLOT(operTransDebtAll()), QKeySequence("Alt+G"));
    mnOperations->addAction(QIcon(":/images/table_run.png"), tr("Change currency: base summ"), this, SLOT(operTransDebtBase()), QKeySequence("Alt+1"));
    mnOperations->addAction(QIcon(":/images/table_run.png"), tr("Change currency: percents"), this, SLOT(operTransDebtPercent()), QKeySequence("Alt+2"));
    ...
    ui->btnOperations->setMenu(mnOperations);
    ui->btnOperations->setPopupMode(QToolButton::InstantPopup);


Название: Re: Динамическое формирование меню
Отправлено: gil9red от Июль 06, 2014, 12:16
Отлавливайте сигнал void QMenu::aboutToShow () (http://qt-project.org/doc/qt-4.8/qmenu.html#aboutToShow) и в слоте, делайте с меню что захотите :)


Название: Re: Динамическое формирование меню
Отправлено: Igors от Июль 06, 2014, 12:46
Отлавливайте сигнал void QMenu::aboutToShow () (http://qt-project.org/doc/qt-4.8/qmenu.html#aboutToShow) и в слоте, делайте с меню что захотите :)
А как быть с горячими/холодными клавишами, напр Ctrl+O ?


Название: Re: Динамическое формирование меню
Отправлено: gil9red от Июль 06, 2014, 12:59
Отлавливайте сигнал void QMenu::aboutToShow () (http://qt-project.org/doc/qt-4.8/qmenu.html#aboutToShow) и в слоте, делайте с меню что захотите :)
А как быть с горячими/холодными клавишами, напр Ctrl+O ?
хз :)

Цитировать
Как лучше сделать, чтоб перед отображение меню QMenu можно было его формировать по-разному, в зависимости от некоторых условий? Т.е. как отловить и где момент отображения меню?
Такой был вопрос автора, и я на него ответил :D


Название: Re: Динамическое формирование меню
Отправлено: radislav72 от Июль 10, 2014, 13:05
Спасибо, то что надо!


Название: Re: Динамическое формирование меню
Отправлено: vulko от Июль 18, 2014, 13:24
Имхо это все какие-то шаманства.

contextMenuEvent может и неплох, но вот например в qgraphicsscene с виджетами это не работает как надо.
использовать aboutToShow ивент тоже имхо не комильфо, стороннему программисту логика будет непонятна.

для себя динамическую генерацию контекстных меню решил так:
для каждого конкретного объекта (виджета и т.п.) обработчик mouseReleaseEvent создает нужное контекстное меню и вызывает метод exec() для него.

имхо это куда логичнее чем создавать пустое меню, а потом, где-то в aboutToShow добавлять в него контент.