文章目录
QMenu Class
QMenu类提供了一个用于菜单栏、上下文菜单和其他弹出菜单的菜单小部件。
Header | #include < QLineEdit > |
---|---|
qmake | QT += widgets |
Inherits | QWidget |
Inherited By |
详细说明
菜单小部件是一个选择菜单。它可以是菜单栏中的下拉菜单,也可以是独立的上下文菜单。当用户单击相应的项目或按指定的快捷键时,下拉菜单由菜单栏显示。使用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()。
属性
-
icon: QIcon 菜单的图标
这相当于menuAction() 的QAction::icon属性。
默认情况下,如果未显式设置图标,则此属性包含空图标。
访问功能:
- QIcon icon() const
- void setIcon(const QIcon &icon)
-
separatorsCollapsible: bool 是否应折叠连续分隔符
此属性指定是否应将菜单中的连续分隔符可视地折叠为单个分隔符。菜单开头或结尾的分隔符也被隐藏。
默认情况下,此属性为true。访问功能:
- bool separatorsCollapsible() const
- void setSeparatorsCollapsible(bool collapse)
-
tearOffEnabled: bool 菜单是否支持撕开
如果为true,则菜单包含一个特殊的删除项(通常在菜单顶部显示为虚线),该项在触发菜单时创建菜单的副本。
这个“撕下来的”拷贝放在一个单独的窗口中。它包含与原始菜单相同的菜单项,除了可拆卸手柄。
默认情况下,此属性为false。访问功能:
- bool isTearOffEnabled() const
- void setTearOffEnabled(bool)
-
title: QString 菜单的标题
访问功能:
- QString title() const
- void setTitle(const QString &title)
-
toolTipsVisible: bool 菜单操作的工具提示是否应可见
此属性指定操作菜单项是否显示其工具提示。
默认情况下,此属性为false。访问功能:
- bool toolTipsVisible() const
- void setToolTipsVisible(bool visible)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STbUFyxa-1611892586591)(https://gitee.com/shenjiguicang/test/raw/master/images/20210129103334.png)]
公共函数
构造和析构
- QMenu(const QString &title, QWidget *parent = nullptr)
- QMenu(QWidget *parent = nullptr)
- virtual ~QMenu()
属性相关
- QIcon icon() const
- void setIcon(const QIcon &icon)
- bool separatorsCollapsible() const
- void setSeparatorsCollapsible(bool collapse)
- bool isTearOffEnabled() const
- void setTearOffEnabled(bool)
- QString title() const
- void setTitle(const QString &title)
- bool toolTipsVisible() const
- void setToolTipsVisible(bool visible)
活动和默认操作
- QAction * activeAction() const
- void setActiveAction(QAction *act)
- QAction * defaultAction() const
- void setDefaultAction(QAction *act)
位置上的操作和操作的几何大小
- QAction * actionAt(const QPoint &pt) const
- QRect actionGeometry(QAction *act) const
添加操作项
便利函数使用文本创建新操作。函数将新创建的操作添加到菜单的操作列表中,并返回它。
QMenu拥有返回的QAction的所有权。
- QAction * addAction(const QString &text)
- QAction * addAction(const QIcon &icon, const QString &text)
- QAction * addAction(const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
- QAction * addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member, const QKeySequence &shortcut = 0)
- QAction * addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0)
- QAction * addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
- QAction * addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut = 0)
- QAction * addAction(const QIcon &icon, const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0)
增加子菜单
添加子菜单。它返回menu的menuAction() 。此容器菜单不拥有子菜单的所有权。
- QAction * addMenu(QMenu *menu)
- QMenu * addMenu(const QString &title)
- QMenu * addMenu(const QIcon &icon, const QString &title)
- QAction * insertMenu(QAction *before, QMenu *menu)
- QAction * menuAction() const 返回与此菜单关联的操作
增加部分
创建一个新的部分操作,即QAction::isSeparator() 返回true但同时具有文本提示的操作,并将新操作添加到此菜单的操作列表中。它返回新创建的操作。
QMenu拥有返回的QAction的所有权。
- QAction * addSection(const QString &text)
- QAction * addSection(const QIcon &icon, const QString &text)
- QAction * insertSection(QAction *before, const QString &text)
- QAction * insertSection(QAction *before, const QIcon &icon, const QString &text)
增加分割线
- QAction * addSeparator()
- QAction * insertSeparator(QAction *before)
分离式菜单
- void hideTearOffMenu()
- bool isTearOffMenuVisible() const
- void showTearOffMenu()
- void showTearOffMenu(const QPoint &pos)
清空
- void clear()
- bool isEmpty() const
显示
-
QAction * exec() 同步显示
-
QAction * exec(const QPoint &p, QAction *action = nullptr)
exec(QCursor::pos()); 当前鼠标位置
exec( somewidget.mapToGlobal( QPoint(0,0) ) ); 与小部件对齐
exec(e->globalPos()); 对QMouseEvent* e的反应
-
void popup(const QPoint &p, QAction *atAction = nullptr) 异步显示
macOS相关
- void setAsDockMenu() 通过单击应用程序停靠图标选项,将此菜单设置为可用的停靠菜单。仅在macOS上可用。
- NSMenu * toNSMenu() 返回此菜单的本机NSMenu。仅在macOS上可用
重写的公共函数
- virtual QSize sizeHint() const override
信号
-
void aboutToHide() 将要隐藏
-
void aboutToShow() 将要显示
-
void hovered(QAction *action) 此信号在高亮显示菜单操作时发出
操作是导致发出信号的操作。这通常用于更新状态信息。 -
void triggered(QAction *action) 此信号在触发此菜单中的操作时发出
动作是导致发出信号的动作。通常,您会将每个菜单操作的triggered() 信号连接到它自己的自定义槽,但有时您会希望将多个操作连接到单个槽,例如,当您有一组密切相关的操作时,例如“left justify”、“center”、“right justify”。
注意:此信号是为层次结构中的主父菜单发出的。因此,只有父菜单需要连接到插槽;子菜单不需要连接。
静态的公共函数
- QAction * exec(QList<QAction *> actions, const QPoint &pos, QAction *at = nullptr, QWidget *parent = nullptr)
受保护的函数
- int columnCount() const
- void initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const
重写的受保护的函数
- virtual void actionEvent(QActionEvent *e) override
- virtual void changeEvent(QEvent *e) override
- virtual void enterEvent(QEvent *) override
- virtual bool event(QEvent *e) override
- virtual bool focusNextPrevChild(bool next) override
- virtual void hideEvent(QHideEvent *) override
- virtual void keyPressEvent(QKeyEvent *e) override
- virtual void leaveEvent(QEvent *) override
- virtual void mouseMoveEvent(QMouseEvent *e) override
- virtual void mousePressEvent(QMouseEvent *e) override
- virtual void mouseReleaseEvent(QMouseEvent *e) override
- virtual void paintEvent(QPaintEvent *e) override
- virtual void timerEvent(QTimerEvent *e) override
- 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