Можно наследовать виджет и переопределить виртуальную функцию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ...
protected :
virtual void contextMenuEvent(QContextMenuEvent * event);
...
void myWidget::contextMenuEvent(QContextMenuEvent * event)
{
QMenu menu( this );
menu.addAction(QPixmap( "C:\\Qt\\pro\\popupmenu-build-desktop\\debug\\ico.png" ), "ShowMessage" , this , SLOT(msg()));
menu.addAction( "About Qt" , qApp, SLOT(aboutQt()));
menu.addSeparator();
menu.addAction( "Exit" , qApp, SLOT(qApp-> exit ()));
menu.exec(event->globalPos());
}
|
Можно подобно, через QAction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ...
protected :
virtual void contextMenuEvent(QContextMenuEvent * event);
...
void myWidget::contextMenuEvent(QContextMenuEvent * event)
{
QMenu * menu = new QMenu();
if (bTheOpen)
{
QAction * ActOpenBrowser= new QAction(tr( "Открыть в браузере" ), menu);
ActOpenBrowser->setStatusTip(tr( "Это подсказка в StatusBar" ));
ActOpenBrowser->setIcon(QIcon( ":/myprog/icons/32_browser.png" ));
connect(ActOpenBrowser,SIGNAL(triggered()), this ,SLOT(slotOpenBrowser()));
menu->addAction(ActOpenBrowser);
}
if (!menu->isEmpty())
{
menu->exec(event->globalPos());
}
delete menu
}
|
Можно прицепить меню, к уже существующему виджету, не наследуя его
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <QApplication>
#include <QLineEdit>
#include <QAction>
int main( int argc, char *argv[])
{
QApplication a(argc, argv);
QLineEdit le;
le.show();
le.addAction( new QAction(QObject::tr( "qwe" ),&le));
le.addAction( new QAction(QObject::tr( "asd" ),&le));
le.setContextMenuPolicy(Qt::ActionsContextMenu);
return a.exec();
}
|
Есть еще вариант того же, но с обработчиком контекстного меню, через сигнал
В приведенном ниже примере, в классе TabWidget (наследнике от QTabWidget) устанавливается контекстное меню на ярлыки вкладок (на элемент QTabBar)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | TabWidget::TabWidget(QWidget * parent):QTabWidget(parent)
{
ActClose = new QAction(tr( "Close" ), this );
connect(ActClose,SIGNAL(triggered()), this ,SLOT(slotClose()));
QTabBar * tb=tabBar();
tb->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tb, SIGNAL(customContextMenuRequested( const QPoint &)), SLOT(slotShowContextMenuTabBar( const QPoint &)));
}
void TabWidget::slotShowContextMenuTabBar( const QPoint &point)
{
if (point.isNull()) return ;
QTabBar * tb=tabBar();
int tabIndex = tb->tabAt(point);
if (tabIndex!=currentIndex()) setCurrentIndex(tabIndex);
QMenu menu( this );
menu.addAction(ActClose);
menu.exec(tb->mapToGlobal(point));
}
void TabWidget::slotClose( void )
{
removeTab(currentIndex());
}
|