【问题标题】:How to add an entry to toolbar context menu in qt?如何在 qt 的工具栏上下文菜单中添加一个条目?
【发布时间】:2016-06-26 06:48:15
【问题描述】:

默认情况下,工具栏的上下文菜单会填充工具栏的名称。我想通过一个额外的条目来扩展这个上下文菜单。

我找到了一个扩展 QTextEdit 元素的上下文菜单的示例。

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

但是,它使用 QTextEdit 类的 createStandardContextMenu。但 QToolBar 似乎没有该属性:

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

编辑

显然,默认上下文菜单是来自 QMainWindow 的菜单。

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

很遗憾,我还不知道如何添加条目。

编辑

我正在使用这个来源:

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

【问题讨论】:

  • 当投反对票时,请随时给我一个提示,告诉我如何改进我的问题...
  • 您是否尝试过获取当前上下文菜单并添加到其中?
  • @hyde 谢谢。我想我正在为“获取当前上下文菜单”部分而苦苦挣扎。我是qt的血腥初学者。你能给我一个提示吗?

标签: c++ qt contextmenu toolbar


【解决方案1】:

如果您想为主窗口中的所有QToolBars 提供相同的上下文菜单,则无需派生QToolBar,您只需在主窗口中覆盖createPopupMenu() 即可将您的自定义操作添加到像这样返回菜单:

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;
}

【讨论】:

  • 谢谢。但是,我得到了一个error: no 'QMenu* MainWindow::createPopupMenu()' member function declared in class 'MainWindow'。我需要添加其他东西吗?
  • 当然你应该将声明添加到你的头文件中。 IE,QMenu* createPopupMenu();mainwindow.hMainWindow 类的 public 部分。 . .
  • @Mike 你介意在你的解决方案中为 MainWindow 管理的所有上下文菜单创建自定义操作,而 OP 只希望它在工具栏上吗?至少问题标题和原文是这样说的。
  • 啊,我明白了。我实际上不知道工具栏可以有不同的上下文菜单,因为默认情况下它们都有相同的。
  • @Daniel 这不应该是你的决定。您到底想在哪里添加额外的项目?如果到处都比迈克的解决方案,如果只是在工具栏上 - 比我的。
【解决方案2】:

你需要从QToolBar派生出你自己的类并重写它的虚函数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;
}

如果您想保留标准菜单,我创建了我的主窗口并将您的项目添加到其中,请保留指向您的 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;
}

【讨论】:

  • 谢谢。但是,我得到了一个error: 'm_pMainWindow' was not declared in this scope。我的主窗口实际上被称为“主窗口”。但是替换它也没有帮助。我已将我正在使用的来源添加到我的问题中。
  • @Daniel 当然,您需要将该成员添加到您的 QMyToolBar 并正确初始化它
  • 是的,当然。但是您是否只希望在原始问题中或在主窗口的任何地方询问时仅在工具栏上附加菜单项?
  • 谢谢。抱歉,我正在努力学习 qt 框架。你介意给我一些更具体的指导吗?
  • 其实,无处不在。但是,如果您的解决方案也能正常工作,我会非常高兴。
猜你喜欢
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2011-10-20
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多