类的枚举成员变量:
这个枚举类型主要是在调用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);
运行效果如下:
/* 初始化Action菜单 */
actionMenu = new QMenu("Action");
leftAction = new QAction("Left", this);
rightAction = new QAction("Right", this);
centerAction = new QAction("Center", this);
justifyAction = new QAction("Justify", this);
actionGroup = new QActionGroup(this);
actionMenu->addAction(actionGroup->addAction(leftAction));
actionMenu->addAction(actionGroup->addAction(rightAction));
actionMenu->addAction(actionGroup->addAction(centerAction));
actionMenu->addAction(actionGroup->addAction(justifyAction));
可以使用下面的槽函数验证默认情况下,一次只有一个action可以被选中。当然也可以设置action的
bool | isExclusive () const |
为false,使得一次可以选中多个:
void MainWindow::initConnect()
{
connect(fileOpenAction, SIGNAL(triggered()),
this, SLOT(sendActivate()));
connect(fileSaveAction, SIGNAL(hovered()),
this, SLOT(ansHovered()));
connect(leftAction, SIGNAL(triggered()),
this, SLOT(ansTriggered()));
connect(rightAction, SIGNAL(triggered()),
this, SLOT(ansTriggered()));
connect(centerAction, SIGNAL(triggered()),
this, SLOT(ansTriggered()));
connect(justifyAction, SIGNAL(triggered()),
this, SLOT(ansTriggered()));
}
运行效果:
备注:
一、放置到ActionGroup中就默认是exclusive。
二、是否出现选中的标志"小圆点"是通过设置setcheckable完成的。两者并无联系。
关于QActionGroup的使用,我发的一个帖子中有提到,再次感谢网友jdwx1
帖子的连接如下,感兴趣的可以看看QActionGroup只对子菜单生效?
本示例代码来自:http://www.qtcn.org/bbs/simple/?t28610.html
功能:设置QMenu中菜单项的高度
代码片段:
class MyMenuItem:public QWidget
{
Q_OBJECT
public:
MyMenuItem(QWidget *parent)
{
new QLabel("test",this);
}
};
int main(int argc, char *argv[])
{
popupMenu = new QMenu(this);
QAction *action1 = new QAction(tr("&New1"), this);
QAction *action2 = new QAction(tr("&New2"), this);
QAction *action3 = new QAction(tr("&New3"), this);
QAction *action4 = new QAction(QIcon("./load.png"), tr("Bookstore"), this);
popupMenu->addAction(action1);
popupMenu->addAction(action2);
popupMenu->addAction(action3);
popupMenu->addAction(action4);
MyMenuItem *item1 = new MyMenuItem(this);
item1->setFixedSize(100,100); //这里可以设置大小
QWidgetAction *action1 = new QWidgetAction(popupMenu);
action1->setDefaultWidget(item1);
MyMenuItem *item2 = new MyMenuItem(this);
QWidgetAction *action2 = new QWidgetAction(popupMenu);
action2->setDefaultWidget(item2);
MyMenuItem *item3 = new MyMenuItem(this);
QWidgetAction *action3 = new QWidgetAction(popupMenu);
action3->setDefaultWidget(item3);
popupMenu->exec();
}