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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Контекстное меню  (Прочитано 3901 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Июль 21, 2009, 14:16 »

Вобщем есть такая тема, в QMainWindow создается меню(QMenu), вот хотелось бы точно такое же создать на виджете,
делаю вот так

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

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

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

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

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

Подскажите чёго делать, как отловить момент всплытия меню и в главном окне и на виджете, и желатнельно что бы это было одно и тоже QMenu. такое бывает?   
Записан
ufna
Гость
« Ответ #1 : Июль 21, 2009, 14:33 »

в этом виджете ловишь contextMenuEvent, в нем создаешь новое QMenu, пичкаешь его экшнами что заслал и все.

Код
C++ (Qt)
void cYourClass::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu("my", 0);
menu.addActions(...);
menu.exec(event->screenPos());
}
Записан
uriel
Гость
« Ответ #2 : Июль 21, 2009, 14:35 »

С виджетом можно проще - просто переопределить contextMenuEvent или повесить фильтр событий. Тогда можно будет использовать один и тот же объект меню сразу в обоих местах и ловить всплытие в aboutToShow.
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Июль 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)));

В итоге имеем одну менюшку.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #4 : Июль 21, 2009, 15:43 »

Всем спасибо разобрался, MoPDoBoPoT нечто подобное и сделал как ты описал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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