Можно наследовать виджет и переопределить виртуальную функцию
Можно подобно, через QAction
Можно прицепить меню, к уже существующему виджету, не наследуя его
Есть еще вариант того же, но с обработчиком контекстного меню, через сигнал
В приведенном ниже примере, в классе TabWidget (наследнике от QTabWidget) устанавливается контекстное меню на ярлыки вкладок (на элемент QTabBar)
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()); } |