Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ecspertiza от Июль 21, 2009, 14:16



Название: Контекстное меню
Отправлено: ecspertiza от Июль 21, 2009, 14:16
Вобщем есть такая тема, в QMainWindow создается меню(QMenu), вот хотелось бы точно такое же создать на виджете,
делаю вот так

QWidget::addActions(QMenu::actions())

все замечательно создает, но есть одно но нужно отлавливать момент всплытия меню(во сказал), то есть тот самый момент когда оно появляется и на виджете и в главном меню, я знаю что у меню есть сигнал aboutToShow(), в этом случае оно работает только при всплытии в главном меню.

если делаю вот так

QWidget::addAction(QMenu::menuAction())

то работает всё нормально, но при этом, контекстное меню выглядит плохо, оно грубо говоря вместе с заголовком, а нужно без него.

Подскажите чёго делать, как отловить момент всплытия меню и в главном окне и на виджете, и желатнельно что бы это было одно и тоже QMenu. такое бывает?   


Название: Re: Контекстное меню
Отправлено: ufna от Июль 21, 2009, 14:33
в этом виджете ловишь contextMenuEvent, в нем создаешь новое QMenu, пичкаешь его экшнами что заслал и все.

Код
C++ (Qt)
void cYourClass::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu("my", 0);
menu.addActions(...);
menu.exec(event->screenPos());
}


Название: Re: Контекстное меню
Отправлено: uriel от Июль 21, 2009, 14:35
С виджетом можно проще - просто переопределить contextMenuEvent или повесить фильтр событий. Тогда можно будет использовать один и тот же объект меню сразу в обоих местах и ловить всплытие в aboutToShow.


Название: Re: Контекстное меню
Отправлено: MoPDoBoPoT от Июль 21, 2009, 14:42
1. Создаешь меню (yourMenu), добавляешь в него все необходимые тебе экшены и хранишь его как член класса.
2. Добавляешь меню в MainWindow.
3. Для необходимого тебе виджета (yourWidget) используешь QWidget::setContextMenuPolicy(Qt::CustomContextMenu)
4. Создаешь слот с тамким содержимым:
Код:
void slotCntxMenu(const QPoint &point)
{
   yourMenu->popup(yourWidget->mapToGlobal(point));
}
5. Делаешь такое соединение connect(yourWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotCntxMenu(QPoint)));

В итоге имеем одну менюшку.


Название: Re: Контекстное меню
Отправлено: ecspertiza от Июль 21, 2009, 15:43
Всем спасибо разобрался, MoPDoBoPoT нечто подобное и сделал как ты описал.