Russian Qt Forum

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



Название: Свое контекстное меню
Отправлено: pashazz от Июнь 19, 2009, 17:32
В тулбаре нужно реализовать свое контекстное меню, естественно брать из QToolBar::actions() нельзя, т.к. контекстное меню и собственно кнопки на тулбаре различны.

Сделал contextMenuPolicy = CustomContextMenu, слот определил, меню показывается, но:
Код
C++ (Qt)
void MainWindow::onToolbarMenu(QPoint p) {
   cmToolbars->exec(p);
}
 

Мыши на скрине нет, но она находится на статусбаре внизу. Т.е. меню не отображается там, где нужно

Что делать?



Название: Re: Свое контекстное меню
Отправлено: pashazz от Июнь 19, 2009, 17:35
QMenu::exec (p, actionAt(p)); использовал, все безрезультатно.


Название: Re: Свое контекстное меню
Отправлено: spectre71 от Июнь 19, 2009, 17:37
А что за:
void MainWindow::onToolbarMenu(QPoint p);

Какую позицию ты передаешь, откуда она берется.
Код в студию!


Название: Re: Свое контекстное меню
Отправлено: pashazz от Июнь 19, 2009, 17:58
Код
C++ (Qt)
//отрывок функции
cmToolbars = new QMenu (this);
 
cmToolbars->addAction(ui->actMosaicTb);
cmToolbars->addAction(ui->actWebTb);
cmToolbars->addAction(ui->actManager);
cmToolbars->addAction(ui->actLocTb);
cmToolbars->addAction(ui->actNcsa);
cmToolbars->addSeparator();
cmToolbars->addAction(ui->actHotlinkTb);
cmToolbars->addAction(ui->actStatus);
cmToolbars->addSeparator();
cmToolbars->addAction(ui->actManagerConf);
cmToolbars->addAction(ui->actHBarConf);
cmToolbars->addSeparator();
cmToolbars->addAction(ui->actToolConf);
cmToolbars->addAction(ui->actButText);
 
cmToolbars->addAction(ui->actDefaultLayout);
 
connect (ui->statusBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onToolbarMenu(QPoint)), Qt::DirectConnection);
connect (ui->tbMosaic, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onToolbarMenu(QPoint)), Qt::DirectConnection);
connect(ui->tbWeb, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onToolbarMenu(QPoint)), Qt::DirectConnection);
connect (ui->tbLocation, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onToolbarMenu(QPoint)), Qt::DirectConnection);
//т.е видно что это слот
//при любом типе соединения результат один и тот же
 
 
//и вот слот
 
void MainWindow::onToolbarMenu(QPoint p) {
   cmToolbars->exec(p);
}
 


Название: Re: Свое контекстное меню
Отправлено: spectre71 от Июнь 19, 2009, 17:59
если:
void QWidget::customContextMenuRequested ( const QPoint & pos )   [signal]
то
QPoint QWidget::mapToGlobal ( const QPoint & pos ) const


Название: Re: Свое контекстное меню
Отправлено: spectre71 от Июнь 19, 2009, 18:03
void MainWindow::onToolbarMenu(QPoint p) {
   QWidget* w = static_cast<QWidget*>(QObject::sender());
   cmToolbars->exec(w->mapToGlobal(p));
}


Название: Решено
Отправлено: pashazz от Июнь 20, 2009, 10:08
Спасибо.