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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Контекстное меню для виджета, созданного в QtDesigner  (Прочитано 11618 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июль 17, 2008, 19:24 »

Здравствуйте!


Начал разбираться с контекстным меню, и что-то понять не могу как нада делать.

Есть форма, созданная в QtDesigner. На ней три виджета - QTreeView, QListView, QTextEdit. Нужно отлавливать вызов контекстного меню для разных виджетов, т.е. для каждого виджета должно быть свое контекстное меню.

Как оказалось, вызов контекстного меню - это не сигнал, а событие, которое можно переопределить для всего окна (как в примере mainwindows/menus),

Код:
...
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu(this);
    menu.addAction(cutAct);
    menu.addAction(copyAct);
    menu.addAction(pasteAct);
    menu.exec(event->globalPos());
}
...

Тогда будет одно контекстное меню для всего главного окна.

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

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Июль 17, 2008, 19:41 »

Асистант читать нехотим:

Цитировать
void QWidget::customContextMenuRequested ( const QPoint & pos )   [signal]
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #2 : Июль 17, 2008, 19:47 »

Код:
...
connect(treeView, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(showContextMenuForTreeView(const QPoint &)));
...

в showContextMenuForTreeView создается и показывается собственно контекстное меню:
Код:
void MainWindow::showContextMenuForTreeView(const QPoint &pos)
{
QMenu contextMenu(tr("Context menu"), this);

contextMenu.addActions(new QAction(tr("Action "), this));

contextMenu.exec(treeView->viewport()->mapToGlobal(pos));
}
ЗЫ. читаем про QWidget::customContextMenuRequested в ассистанте.
Записан
Dodge
Гость
« Ответ #3 : Июль 17, 2008, 21:53 »

Если повнимательнее почитать ассистент, то можно найти у класса QObject метод installEventFilter... т.о. можно установить один и тот же обработчик событий вызова контекстного меню, для всех ваших виджетов. Если я вас правильно понял, это пожалуй саый удобный вариант.  Улыбающийся
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Июль 17, 2008, 21:56 »

Цитата: pastor
Асистант читать нехотим:
void QWidget::customContextMenuRequested ( const QPoint & pos )   [signal]

Хотим, но полноценно немогём. Я немецкий учил. И допетрить, что помимо события надо искать сдублированный сигнал мне как слабо знающему Qt реально сложно.

Цитата: spirit
Код:
connect(treeView, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(showContextMenuForTreeView(const QPoint &)));

Ога, помогло. Только обязательно вначале надо сделать

Код:
recordview->setContextMenuPolicy(Qt::CustomContextMenu);

иначе сигнал до слота не дойдет.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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