QAction系列详解
QAction系列详解
⼀、QAction类详解
【详细描述】
QAction类提供了抽象的⽤户界⾯action,这些action可以被放置在窗⼝部件中。
应⽤程序可以通过菜单,⼯具栏按钮以及键盘快捷键来调⽤通⽤的命令。由于⽤户期望每个命令都能以相同的⽅式执⾏,⽽不管命令所使⽤的⽤户界⾯,这个时候使⽤action来表⽰这些命令就显得⼗分有⽤。
Actions可以被添加到菜单和⼯具栏中,并且可以⾃动保持在菜单和⼯具栏中的同步。例如,在⼀个字处理软件中,如果⽤户在⼯具栏中按下了Bold按钮,那么菜单中的Bold选项就会⾃动被选中。
Actions可以作为独⽴的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了⾮常简便的⽅法⽤于创建适合⽤作菜单项的actions。
QAction可以包括⼀个图标,菜单⽂本,快捷键,状态⽂本,"What`s This"⽂本以及⼀个tooltip。这些内容的绝⼤部分都可以在构造函数中设置。也可以通过tIcon(),tIconText(),tShortCut(),tStatusTip(),tWhatsThis和SetToolTip()函数分别设置。对于菜单项,我们还可以通过
tFont()单独为它们设置font。
可以通过QWidget::addAction()或者是QGraphicsWidget::addAction()函数将Actions添加到窗⼝部件上。注意,只有将Actions添加到窗⼝部件上之后,我们才可以使⽤这些actions;当actions的快捷键是全局的时候,我们也必须先将actions添加到窗⼝部件上。
⼀旦QAction被创建了,那么就必须将它添加到相关的菜单和⼯具栏上,然后将它们链接到实现相应action功能的槽函数上。例如:
openAct = new QAction(QIcon(":/images/open.png"), tr("&"), this);
openAct->tShortcuts(QKeySequence::Open);
openAct->tStatusTip(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("&",this);
fileSaveAction=new QAction("&",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(ndActivate()));
棕垫
connect(fileSaveAction,SIGNAL(hovered()),
this,SLOT(ansHovered()));
}
void MainWindow::ndActivate()
{
/*这将会导致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("&",this);
fileSaveAction=new QAction("&",this);
fileMenu->addAction(fileOpenAction);
fileMenu->addAction(fileSaveAction);
/*初始化Edit菜单*/
editMenu=new QMenu("&Edit");
editCopyAction=editMenu->addAction("&Copy");
editCutAction=editMenu->addAction(QIcon(":/cut.PNG"),"&Cut");
//editCutAction->tPriority(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->tToolButtonStyle(Qt::ToolButtonTextBesideIcon);
汽车静电怎么消除}
此时注释掉了设置优先级的语句,图标和⽂字均能显⽰出来,效果如下图:
取消上⾯的注释;
苟且偷生意思是什么
/*初始化Edit菜单*/
editMenu=new QMenu("&Edit");
editCopyAction=editMenu->addAction("&Copy");
editCutAction=editMenu->addAction(QIcon(":/cut.PNG"),"&Cut");
editCutAction->tPriority(QAction::LowPriority);
运⾏效果如下:
⼆、QActionGroup类详解
【详细描述】
QActionGroup类将actions分组。
在某些情况下将QAction分组是⼗分有⽤的。例如,如果你有⼀个Left Align的action,⼀个Right Align的action,⼀个Justify的action,
以及⼀个Center action,在统⼀时刻所有这些actions只能有⼀个被激活。⼀种简便的做法就是将这些actions以分组的⽅式组织。
下⾯是⼀个⽰例:
alignmentGroup = new QActionGroup(this);
alignmentGroup->addAction(leftAlignAct);母亲生日礼物
alignmentGroup->addAction(rightAlignAct);
alignmentGroup->addAction(justifyAct);
alignmentGroup->addAction(centerAct);
leftAlignAct->tChecked(true);
在上⾯的⽰例中,我们创建了⼀个action组。由于action group默认是互斥的,因此在同⼀时刻只有⼀个会被选中。
当组内的某个action被选中的时候,QActionGroup就会发射triggered()信号。通常情况下,组内的每个action发射⾃⼰的triggered()信号。
正如上⾯提到的,action group默认是互斥的;它确保在同⼀时刻只有⼀个action会被选中。如果你想创建⼀个action group⽽不想时它们是互斥关系,那么你可以通过调⽤tExclusive(fal)来关闭互斥关系。
可以使⽤addAction()函数将action添加到action group中,然⽽更常见的做法是在创建action的时候指定⼀个group;这确保了这些actions具有同⼀个⽗亲。可以通过在group中添加分割线使得各个action分开显⽰,可以使⽤QAction的tSeparator()添加分割线。通常使⽤QWidget::addActions()函数将action group添加到窗⼝部件上。
【⽰例】
/*初始化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);