基本Widgets(29):【类】QMenu [官翻]

QMenu Class

QMenu类提供了一个用于菜单栏、上下文菜单和其他弹出菜单的菜单小部件。

Header#include < QLineEdit >
qmakeQT += widgets
InheritsQWidget
Inherited By

详细说明

img

菜单小部件是一个选择菜单。它可以是菜单栏中的下拉菜单,也可以是独立的上下文菜单。当用户单击相应的项目或按指定的快捷键时,下拉菜单由菜单栏显示。使用QMenuBar::addMenu() 将菜单插入菜单栏。上下文菜单通常由一些特殊的键盘键或右键单击来调用。它们可以通过popup() 异步执行,也可以通过exec() 同步执行。菜单也可以响应按钮的按下而被调用;除了如何调用它们之外,它们与上下文菜单一样。

操作(Actions)

菜单由操作项列表组成。操作是通过addAction() 、addActions() 和insertAction() 函数添加的。操作是垂直表示的,并由QStyle呈现。此外,操作可以有文本标签、在最左侧绘制的可选图标和快捷键序列,如“Ctrl+X”。

菜单中的现有操作可以通过actions() 找到。

有四种操作项:分隔符、显示子菜单的操作、小部件和执行操作的操作。分隔符与addSeparator() 一起插入,子菜单与addMenu() 一起插入,所有其他项都被视为操作项。

当插入操作项时,您通常指定一个接收器和一个插槽。当项目被 triggered() 时,接收者将被通知。此外,QMenu提供了两个信号,triggered()和hover(),它们向从菜单中触发的QAction发出信号。

使用clear() 清除菜单,并使用removeAction() 删除单个操作项。

QMenu也可以提供分离式菜单。分离式菜单是一个顶层窗口,它包含菜单的副本。这使得用户可以“tear off”经常使用的菜单,并将它们放置在屏幕上一个方便的位置。如果您希望将此功能用于特定菜单,可以使用setTearOffEnabled()插入一个分离句柄。当使用分离式菜单时,请记住,这个概念通常不会在微软Windows上使用,所以一些用户可能不熟悉它。考虑使用QToolBar代替。

小部件可以通过QWidgetAction类插入菜单。这个类的实例用于保存小部件,并通过采用QAction的addAction() 重载插入到菜单中。如果QWidgetAction触发triggered() 信号,菜单将关闭。

警告:要使QMenu在屏幕上可见,应使用exec() 或popup() 而不是show() 。

基于Cocoa的Qt构建macOS上的QMenu

QMenu只能在菜单/菜单栏中插入一次。后续的插入将没有效果,或者将导致禁用菜单项。

有关如何在应用程序中使用QMenuBar和QMenu的示例,请参阅菜单示例。

重要的继承函数:addAction()、removeAction()、clear()、addSeparator()和addMenu()。

属性

  1. icon: QIcon 菜单的图标

    这相当于menuAction() 的QAction::icon属性。

    默认情况下,如果未显式设置图标,则此属性包含空图标。

    访问功能:

    • QIcon icon() const
    • void setIcon(const QIcon &icon)

  2. separatorsCollapsible: bool 是否应折叠连续分隔符

    此属性指定是否应将菜单中的连续分隔符可视地折叠为单个分隔符。菜单开头或结尾的分隔符也被隐藏。
    默认情况下,此属性为true。

    访问功能:

    • bool separatorsCollapsible() const
    1. void setSeparatorsCollapsible(bool collapse)

  3. tearOffEnabled: bool 菜单是否支持撕开
    如果为true,则菜单包含一个特殊的删除项(通常在菜单顶部显示为虚线),该项在触发菜单时创建菜单的副本。
    这个“撕下来的”拷贝放在一个单独的窗口中。它包含与原始菜单相同的菜单项,除了可拆卸手柄。
    默认情况下,此属性为false。

    访问功能:

    • bool isTearOffEnabled() const
    1. void setTearOffEnabled(bool)

  4. title: QString 菜单的标题

    访问功能:

    • QString title() const
    1. void setTitle(const QString &title)
  5. toolTipsVisible: bool 菜单操作的工具提示是否应可见
    此属性指定操作菜单项是否显示其工具提示。
    默认情况下,此属性为false。

    访问功能:

    • bool toolTipsVisible() const
    1. void setToolTipsVisible(bool visible)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STbUFyxa-1611892586591)(https://gitee.com/shenjiguicang/test/raw/master/images/20210129103334.png)]

公共函数

构造和析构

  1. QMenu(const QString &title, QWidget *parent = nullptr)
  2. QMenu(QWidget *parent = nullptr)
  3. virtual ~QMenu()

属性相关

  1. QIcon icon() const
  2. void setIcon(const QIcon &icon)
  3. bool separatorsCollapsible() const
  4. void setSeparatorsCollapsible(bool collapse)
  5. bool isTearOffEnabled() const
  6. void setTearOffEnabled(bool)
  7. QString title() const
  8. void setTitle(const QString &title)
  9. bool toolTipsVisible() const
  10. void setToolTipsVisible(bool visible)

活动和默认操作

  1. QAction * activeAction() const
  2. void setActiveAction(QAction *act)
  3. QAction * defaultAction() const
  4. void setDefaultAction(QAction *act)

位置上的操作和操作的几何大小

  1. QAction * actionAt(const QPoint &pt) const
  2. QRect actionGeometry(QAction *act) const

添加操作项

便利函数使用文本创建新操作。函数将新创建的操作添加到菜单的操作列表中,并返回它。
QMenu拥有返回的QAction的所有权。

  1. QAction * addAction(const QString &text)
  2. QAction * addAction(const QIcon &icon, const QString &text)
  3. QAction * addAction(const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
  4. QAction * addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
  5. QAction * addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0)
  6. QAction * addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
  7. QAction * addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut = 0)
  8. QAction * addAction(const QIcon &icon, const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)

增加子菜单

添加子菜单。它返回menu的menuAction() 。此容器菜单不拥有子菜单的所有权。

  1. QAction * addMenu(QMenu *menu)
  2. QMenu * addMenu(const QString &title)
  3. QMenu * addMenu(const QIcon &icon, const QString &title)
  4. QAction * insertMenu(QAction *before, QMenu *menu)
  5. QAction * menuAction() const 返回与此菜单关联的操作

增加部分

创建一个新的部分操作,即QAction::isSeparator() 返回true但同时具有文本提示的操作,并将新操作添加到此菜单的操作列表中。它返回新创建的操作。

QMenu拥有返回的QAction的所有权。

  1. QAction * addSection(const QString &text)
  2. QAction * addSection(const QIcon &icon, const QString &text)
  3. QAction * insertSection(QAction *before, const QString &text)
  4. QAction * insertSection(QAction *before, const QIcon &icon, const QString &text)

增加分割线

  1. QAction * addSeparator()
  2. QAction * insertSeparator(QAction *before)

分离式菜单

  1. void hideTearOffMenu()
  2. bool isTearOffMenuVisible() const
  3. void showTearOffMenu()
  4. void showTearOffMenu(const QPoint &pos)

清空

  1. void clear()
  2. bool isEmpty() const

显示

  1. QAction * exec() 同步显示

  2. QAction * exec(const QPoint &p, QAction *action = nullptr)

    exec(QCursor::pos()); 当前鼠标位置

    exec( somewidget.mapToGlobal( QPoint(0,0) ) ); 与小部件对齐

    exec(e->globalPos()); 对QMouseEvent* e的反应

  3. void popup(const QPoint &p, QAction *atAction = nullptr) 异步显示

macOS相关

  1. void setAsDockMenu() 通过单击应用程序停靠图标选项,将此菜单设置为可用的停靠菜单。在macOS上可用。
  2. NSMenu * toNSMenu() 返回此菜单的本机NSMenu。仅在macOS上可用

重写的公共函数

  1. virtual QSize sizeHint() const override

信号

  1. void aboutToHide() 将要隐藏

  2. void aboutToShow() 将要显示

  3. void hovered(QAction *action) 此信号在高亮显示菜单操作时发出
    操作是导致发出信号的操作。这通常用于更新状态信息。

  4. void triggered(QAction *action) 此信号在触发此菜单中的操作时发出
    动作是导致发出信号的动作。

    通常,您会将每个菜单操作的triggered() 信号连接到它自己的自定义槽,但有时您会希望将多个操作连接到单个槽,例如,当您有一组密切相关的操作时,例如“left justify”、“center”、“right justify”。

    注意:此信号是为层次结构中的主父菜单发出的。因此,只有父菜单需要连接到插槽;子菜单不需要连接。

静态的公共函数

  1. QAction * exec(QList<QAction *> actions, const QPoint &pos, QAction *at = nullptr, QWidget *parent = nullptr)

受保护的函数

  1. int columnCount() const
  2. void initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const

重写的受保护的函数

  1. virtual void actionEvent(QActionEvent *e) override
  2. virtual void changeEvent(QEvent *e) override
  3. virtual void enterEvent(QEvent *) override
  4. virtual bool event(QEvent *e) override
  5. virtual bool focusNextPrevChild(bool next) override
  6. virtual void hideEvent(QHideEvent *) override
  7. virtual void keyPressEvent(QKeyEvent *e) override
  8. virtual void leaveEvent(QEvent *) override
  9. virtual void mouseMoveEvent(QMouseEvent *e) override
  10. virtual void mousePressEvent(QMouseEvent *e) override
  11. virtual void mouseReleaseEvent(QMouseEvent *e) override
  12. virtual void paintEvent(QPaintEvent *e) override
  13. virtual void timerEvent(QTimerEvent *e) override
  14. virtual void wheelEvent(QWheelEvent *e) override

相关代码

#include <QtWidgets>
int main(int argc, char *argv[])
{
    QApplication::setStyle (QStyleFactory::create ("fusion")); //windowsvista fusion

    QApplication app(argc,argv);
    app.setApplicationName ("QMenu");

    QMainWindow w0;

    QMenu *menuFile = new QMenu("File",&w0);
    menuFile->addAction ("打开");
    menuFile->addSeparator ();
    menuFile->addSection ("保存操作");
    menuFile->addAction ("保存");
    menuFile->addAction ("另存为...");

    menuFile->setToolTipsVisible (true);

    w0.menuBar ()->addMenu (menuFile);

    QLabel *label = new QLabel(&w0);
    label->setMargin (10);
    label->setStyleSheet ("color:blue");
    label->setText (
                "\n\n\nQMenu *menuFile = new QMenu(\"File\",&w0); \n"
                "menuFile->addAction (\"打开\")->setToolTip (\"Open\");\n"
                "menuFile->addAction (\"保存\")->setToolTip (\"Save\");\n"
                "menuFile->addSeparator ();\n\n"
                "menuFile->setToolTipsVisible (true);");

    w0.setCentralWidget (label);


    w0.show ();

    app.exec();
    return 0;
}

参考

  • 应用程序示例 Application Example
  • 菜单示例 Menus Example
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值