Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Июль 17, 2008, 19:24



Название: Контекстное меню для виджета, созданного в QtDesigner
Отправлено: xintrea от Июль 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?


Название: Re: Контекстное меню для виджета, созданного в QtDesigner
Отправлено: pastor от Июль 17, 2008, 19:41
Асистант читать нехотим:

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


Название: Re: Контекстное меню для виджета, созданного в QtDesigner
Отправлено: spirit от Июль 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 в ассистанте.


Название: Re: Контекстное меню для виджета, созданного в QtDesigner
Отправлено: Dodge от Июль 17, 2008, 21:53
Если повнимательнее почитать ассистент, то можно найти у класса QObject метод installEventFilter... т.о. можно установить один и тот же обработчик событий вызова контекстного меню, для всех ваших виджетов. Если я вас правильно понял, это пожалуй саый удобный вариант.  :)


Название: Re: Контекстное меню для виджета, созданного в QtDesigner
Отправлено: xintrea от Июль 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);

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