How to add an entry to toolbar context menu in qt?

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

By default the context menu of a toolbar is filled with the names of the toolbars. I would like to extend this context menu by an additional entry.

I found an example extending the context menu of a QTextEdit element.

http://www.qtcentre.org/threads/35166-extend-the-standard-context-menu-of-qtextedit

However, it uses the createStandardContextMenu of the QTextEdit class. But QToolBar appears not to have that property:

http://doc.qt.io/qt-4.8/qtoolbar.html

Edit

Apparently, the default context menu is the one from the QMainWindow.

http://doc.qt.io/qt-4.8/qmainwindow.html#createPopupMenu

Unfortunately, I have no clue yet how to add an entry to it.

Edit

I am working with this source:

http://doc.qt.io/qt-5/qtwidgets-mainwindows-application-example.html

回答1:

No need to derive QToolBar if you want to provide the same context menu for all the QToolBars in your main window, you just need to override createPopupMenu() in your main window to add your Custom Action to the returned menu like this:

QMenu* MainWindow::createPopupMenu(){     //call the overridden method to get the default menu  containing checkable entries     //for the toolbars and dock widgets present in the main window     QMenu* menu= QMainWindow::createPopupMenu();     //you can add whatever you want to the menu before returning it     menu->addSeparator();     menu->addAction(tr("Custom Action"), this, SLOT(CustomActionSlot()));     return menu; } 


回答2:

You need to derive your own class from QToolBar and override its virtual function contextMenuEvent:

qmytoolbar.h

#ifndef QMYTOOLBAR_H #define QMYTOOLBAR_H  #include <QToolBar>  class QMyToolBar : public QToolBar {     Q_OBJECT public:     explicit QMyToolBar(QWidget *parent = 0)         : QToolBar(parent){}  protected:     void contextMenuEvent(QContextMenuEvent *event); };  #endif // QMYTOOLBAR_H 

qmytoolbar.cpp

#include "qmytoolbar.h"  #include <QMenu> #include <QContextMenuEvent>  void QMyToolBar::contextMenuEvent(QContextMenuEvent *event) {     // QToolBar::contextMenuEvent(event);      QMenu *menu = new QMenu(this);     menu->addAction(tr("My Menu Item"));     menu->exec(event->globalPos());     delete menu; } 

If you want to retain standard menu created my main window and add your items to it keep a pointer to your QMainWindow' in your QMyToolBar and modify 'QMyToolBar::contextMenuEvent:

void QMyToolBar::contextMenuEvent(QContextMenuEvent *event) {     // QToolBar::contextMenuEvent(event);      QMenu *menu =             //new QMenu(this);             m_pMainWindow->createPopupMenu();       menu->addAction(tr("My Menu Item"));     menu->exec(event->globalPos());     delete menu; } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!