openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); openAct->setShortcuts(QKeySequence::Open); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); fileMenu->addAction(openAct); fileToolBar->addAction(openAct);
我们建议将actions作为使用它们的窗口的孩子创建。在绝大多数情况下,actions都是应用程序主窗口的孩子。
类的枚举成员变量:

这个枚举类型主要是在调用QAction::activate()函数的时候被使用到。我们来看看QAction::activate()函数的原型:

从上面可以看出,我们使用该函数发射信号,而参数event则指明了发射的信号类型。基于action的widgets可以自己发射信号,然而我们也可以显式的调用本API来发射信号。

由于Mac OS X系统的一些特性,Qt 会对一些菜单项进行自动排列。比如,如果你的菜单是“关于”、“设置”、“首选项”、“退出”等等,我们可以给它们分配一个角色,Qt 则会根据这些角色对菜单项的顺序作出正确的排列。方法是,设置 QAction::menuRole 属性,例如:AboutRole、PreferencesRole、QuitRole 或者 NoRole。举例来说,我们可以将“设置”菜单项作为 Mac OS X 的 Application::preferences。
QAction::MenuRole类型的枚举主要描述了在Mac OS X系统上,action如何移动到应用程序的菜单上。设置这个值只对菜单上的直接菜单有效,对子菜单无效。例如:如果有一个File菜单,该File菜单又包含有子菜单,那么如果你针对子菜单设置这些值,那么这些值永远不会起作用。

该优先级用于表明action在用户界面上的优先级。例如,当你的工具栏设置了Qt::ToolButtonTextBesideIcon模式,那么低优先级的actions将不会显示出标签。
示例
(1) 使用Action构造工具栏和菜单栏
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { initMenu(); initToolBar(); } void MainWindow::initMenu() { /* 初始化File菜单 */ fileMenu = new QMenu(tr("File"), this); fileOpenAction = new QAction("&Open...", this); fileSaveAction = new QAction("&Save...", this); fileMenu->addAction(fileOpenAction); fileMenu->addAction(fileSaveAction); /* 初始化Edit菜单 */ editMenu = new QMenu("&Edit"); editCopyAction = editMenu->addAction("&Copy"); editCutAction = editMenu->addAction("&Cut"); /* 将菜单添加到菜单栏上 */ QMenuBar *menuBar = this->menuBar(); menuBar->addMenu(fileMenu); menuBar->addMenu(editMenu); } void MainWindow::initToolBar() { /* 初始化FileToolBar */ fileToolBar = new QToolBar(this); fileToolBar->addAction(fileOpenAction); fileToolBar->addAction(fileSaveAction); /* 初始化EditToolBar */ editToolBar = new QToolBar(this); editToolBar->addAction(editCopyAction); editToolBar->addAction(editCutAction); /* 将工具添加到工具栏上 */ addToolBar(Qt::TopToolBarArea, fileToolBar); addToolBar(Qt::TopToolBarArea, editToolBar); } MainWindow::~MainWindow() { }
(2)测试QAction::activate(QAction::ActionEvent)
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { initMenu(); initToolBar(); initConnect(); } void MainWindow::initConnect() { connect(fileOpenAction, SIGNAL(triggered()), this, SLOT(sendActivate())); connect(fileSaveAction, SIGNAL(hovered()), this, SLOT(ansHovered())); } void MainWindow::sendActivate() { /* 这将会导致fileSaveAction发送信号QAction::hovered() */ fileSaveAction->activate(QAction::Hover); } void MainWindow::ansHovered() { qDebug("Ans!!!"); }
运行结果:

(3)测试QAction::Priority
void MainWindow::initMenu() { /* 初始化File菜单 */ fileMenu = new QMenu(tr("File"), this); fileOpenAction = new QAction("&Open...", this); fileSaveAction = new QAction("&Save...", this); fileMenu->addAction(fileOpenAction); fileMenu->addAction(fileSaveAction); /* 初始化Edit菜单 */ editMenu = new QMenu("&Edit"); editCopyAction = editMenu->addAction("&Copy"); editCutAction = editMenu->addAction(QIcon(":/cut.PNG"), "&Cut"); //editCutAction->setPriority(QAction::LowPriority); /* 将菜单添加到菜单栏上 */ QMenuBar *menuBar = this->menuBar(); menuBar->addMenu(fileMenu); menuBar->addMenu(editMenu); } void MainWindow::initToolBar() { /* 初始化FileToolBar */ fileToolBar = new QToolBar(this); fileToolBar->addAction(fileOpenAction); fileToolBar->addAction(fileSaveAction); /* 初始化EditToolBar */ editToolBar = new QToolBar(this); editToolBar->addAction(editCopyAction); editToolBar->addAction(editCutAction); /* 将工具添加到工具栏上 */ addToolBar(Qt::TopToolBarArea, fileToolBar); addToolBar(Qt::TopToolBarArea, editToolBar); /* 设置工具栏为QT::ToolButtonTextBesideIcon */ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); }
此时注释掉了设置优先级的语句,图标和文字均能显示出来,效果如下图:

/* 初始化Edit菜单 */ editMenu = new QMenu("&Edit"); editCopyAction = editMenu->addAction("&Copy"); editCutAction = editMenu->addAction(QIcon(":/cut.PNG"), "&Cut"); editCutAction->setPriority(QAction::LowPriority);
运行效果如下:

参考:
https://www.yuque.com/docs/share/8c9cd912-4fbc-4656-82b7-9815f9b199d0
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205742.html原文链接:https://javaforall.net
