精华内容
下载资源
问答
  • QAction系列详解一、QAction类详解【详细描述】QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令...

    QAction系列详解

    一、QAction类详解

    【详细描述】

    QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。

    应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面,

    这个时候使用action来表示这些命令就显得十分有用。

    Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。例如,在一个字处理软件中,如果用户在工具栏中按下了Bold按钮,那么菜单中的Bold选项就会自动被选中。

    Actions可以作为独立的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了非常简便的方法用于创建适合用作菜单项的actions。

    QAction可以包括一个图标,菜单文本,快捷键,状态文本,"What`s This"文本以及一个tooltip。这些内容的绝大部分都可以在构造函数中设置。也可以通过setIcon(),setIconText(),setShortCut(),setStatusTip(),setWhatsThis和SetToolTip()函数分别设置。对于菜单项,我们还可以通过

    setFont()单独为它们设置font。

    可以通过QWidget::addAction()或者是QGraphicsWidget::addAction()函数将Actions添加到窗口部件上。注意,只有将Actions添加到窗口部件上之后,我们才可以使用这些actions;当actions的快捷键是全局的时候,我们也必须先将actions添加到窗口部件上。

    一旦QAction被创建了,那么就必须将它添加到相关的菜单和工具栏上,然后将它们链接到实现相应action功能的槽函数上。例如:

    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);

    运行效果如下:

    二、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->setChecked(true);

    在上面的示例中,我们创建了一个action组。由于action group默认是互斥的,因此在同一时刻只有一个会被选中。

    当组内的某个action被选中的时候,QActionGroup就会发射triggered()信号。通常情况下,组内的每个action发射自己的triggered()信号。

    正如上面提到的,action group默认是互斥的;它确保在同一时刻只有一个action会被选中。如果你想创建一个action group而不想时它们是互斥关系,那么你可以通过调用setExclusive(false)来关闭互斥关系。

    可以使用addAction()函数将action添加到action group中,然而更常见的做法是在创建action的时候指定一个group;这确保了这些actions具有同一个父亲。可以通过在group中添加分割线使得各个action分开显示,可以使用QAction的setSeparator()添加分割线。通常使用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);

    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

    为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

    三、QWidgetAction类详解

    【详细描述】

    QWidgetAction通过接口方式继承自QAction,用于将自定义的widget插入基于action的容器,例如工具栏。

    出现在应用程序中的绝大多数的actions都是代表了一个菜单项或工具栏中的一个按钮。然而有时候我们也许要复杂一点的widgets。例如,字处理程序工具栏中使用QComboBox实现zoom action,实现不同程度的缩放。QToolBar提供了QToolBar::insertWidget()函数可以十分方便的将单个widget插入到合适的位置。然而,如果你想在多个容器中实现自定义widget的action,那么你就必须实现QWidgetAction的子类。

    如果QWidgetAction添加到QToolBar,那么就会调用QWidgetAction::createWidget()。我们可以重新实现这个函数创建自定义的widget。

    如果将一个action从容器widget上删除,那么就会调用QWidgetAction::deleteWidget(),调用该函数的参数就是上面创建的自定义widget。该函数的默认实现是将widget隐藏,然后使用QObject::deleteLater()删除它。

    如果你只有一个自定义的widget,那么你就可以使用setDefaultWidget()函数将它设置为默认的widget。那么以后当action被添加到QToolBar上时,就会自动将该自定义的widget添加到QToolBar上。如果将仅有一个默认widget的QWidgetAction同时添加到两个工具栏上,那么仅有第一个添加才会显示出来。QWidgetAction接管了默认的widget。

    注意:这取决于widget激活action,例如重新实现鼠标事件处理者,然后调用QAction::trigger()。

    Mac OS X:在Mac OS X上,如果你将一个widget添加到应用程序菜单栏的某个菜单上,那么该widget可以显示出来,并且可以实现功能,只是有一些限制:

    1、该widget的父对象不再是QMenu而是原生的菜单视图。如果你在其他地方显示菜单(例如作为一个弹出菜单),那么该菜单不会显 示在你期望的地方;

    2、针对该widget的Focus/Keyboard处理不再可用;

    3、由于Apple的设计,该widget的鼠标轨迹暂时不可用;

    4、将triggered()信号链接到打开模态对话框的槽函数上会导致应用程序崩溃(在Mac OS X10.4,这被告知是Apple的一个BUG),一个规避的方法是使用QueuedConnection代替DirecConnection。

    【示例】

    本示例代码来自: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();

    http://blog.csdn.net/chenlong12580/article/details/8872035

    展开全文
  • 有时需要对QAction的文字显示做一些要求,如文字左对齐显示、文字显示在图标(QIcon)上下左右方位等。查询了QAction的方法,并没有这样的属性实现,而且QAction本身的图标具有强制性,设置也占位置(自己测试如此,...

    菜单栏( QMenu )下的动作是由QAction来实现。有时需要对QAction的文字显示做一些要求,如文字左对齐显示、文字显示在图标(QIcon)上下左右方位等。

    查询了QAction的方法,并没有这样的属性实现,而且QAction本身的图标具有强制性,不设置也占位置(自己测试如此,未发现消除图标所占位置的方法)。而网上很多对QAction文字和图标相关属性设置的方法大多为工具栏( QToolBar )下的QAction,即对QToolBar的风格设置方法:setToolButtonStyle(),并没有对菜单栏( QMenu )。

    而其实Qt给提供了实现自定制QAction风格的类,即:QWidgetAction。他有一个指定QWidget的方法:

    void setDefaultWidget(QWidget * widget);

    这样我们就可以自己绘制想要的效果窗口,然后设置给QAction。相对来说,自由度很高。

    下面是我实现的一个例子,仅供参考。

    #include

    #include

    #include

    #include

    QActionWidgetTest::QActionWidgetTest( QWidget *parent )

    : QWidget( parent )

    {

    ui.setupUi(this);

    resize( 600, 400 );

    QMenuBar* pMenuBar = new QMenuBar( this );

    QMenu* pMenu = new QMenu( "MenuTest" );

    pMenu->setFixedWidth( 150 );

    QWidgetAction* pActionLeft = new QWidgetAction( pMenu );

    QWidgetAction* pActionCenter = new QWidgetAction( pMenu );

    QWidgetAction* pActionRight = new QWidgetAction( pMenu );

    QLabel* pLabLeft = new QLabel( "AlignLeft" );

    QLabel* pLabCenter = new QLabel( "AlignCenter" );

    QLabel* pLabRight = new QLabel( "AlignRight" );

    pLabLeft->setAlignment( Qt::AlignLeft );

    pLabCenter->setAlignment( Qt::AlignCenter );

    pLabRight->setAlignment( Qt::AlignRight );

    pActionLeft->setDefaultWidget( pLabLeft );

    pActionCenter->setDefaultWidget( pLabCenter );

    pActionRight->setDefaultWidget( pLabRight );

    pMenu->addAction( pActionLeft );

    pMenu->addAction( pActionCenter );

    pMenu->addAction( pActionRight );

    pMenuBar->addMenu( pMenu );

    }

    效果图如下:

    展开全文
  • 先贴一段描述:Qt文档原文:Detailed DescriptionThe QAction class provides an abstract user interface action that can be inserted into widgets.In applications many common commands can be invoked via ...

    先贴一段描述:

    Qt文档原文:

    Detailed Description

    The QAction class provides an abstract user interface action that can be inserted into widgets.

    In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user expects each command to be performed in the same way, regardless of the user interface used, it is useful to represent each command as an action.

    Actions can be added to menus and toolbars, and will automatically keep them in sync. For example, in a word processor, if the user presses a Bold toolbar button, the Bold menu item will automatically be checked.

    Actions can be created as independent objects, but they may also be created during the construction of menus; the QMenu class contains convenience functions for creating actions suitable for use as menu items.

    A QAction may contain an icon, menu text, a shortcut, status text, "What's This?" text, and a tooltip. Most of these can be set in the constructor. They can also be set independently with setIcon(), setText(), setIconText(), setShortcut(), setStatusTip(), setWhatsThis(), and setToolTip(). For menu items, it is possible to set an individual font with setFont().

    Actions are added to widgets using QWidget::addAction() or QGraphicsWidget::addAction(). Note that an action must be added to a widget before it can be used; this is also true when the shortcut should be global (i.e., Qt::ApplicationShortcut as Qt::ShortcutContext).

    Once a QAction has been created it should be added to the relevant menu and toolbar, then connected to the slot which will perform the action. For example:

    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);

    We recommend that actions are created as children of the window they are used in. In most cases actions will be children of the application's main window.

    一、QAction类详解

    QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。

    应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面,

    这个时候使用action来表示这些命令就显得十分有用。

    Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。例如,在一个字处理软件中,如果用户在工具栏中按下了Bold按钮,那么菜单中的Bold选项就会自动被选中。

    Actions可以作为独立的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了非常简便的方法用于创建适合用作菜单项的actions。

    QAction可以包括一个图标,菜单文本,快捷键,状态文本,"What`s This"文本以及一个tooltip。这些内容的绝大部分都可以在构造函数中设置。也可以通过setIcon(),setIconText(),setShortCut(),setStatusTip(),setWhatsThis和SetToolTip()函数分别设置。对于菜单项,我们还可以通过

    setFont()单独为它们设置font。

    可以通过QWidget::addAction()或者是QGraphicsWidget::addAction()函数将Actions添加到窗口部件上。注意,只有将Actions添加到窗口部件上之后,我们才可以使用这些actions;当actions的快捷键是全局的时候,我们也必须先将actions添加到窗口部件上。

    一旦QAction被创建了,那么就必须将它添加到相关的菜单和工具栏上,然后将它们链接到实现相应action功能的槽函数上。例如:

    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);

    运行效果如下:

    二、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->setChecked(true);

    在上面的示例中,我们创建了一个action组。由于action group默认是互斥的,因此在同一时刻只有一个会被选中。

    当组内的某个action被选中的时候,QActionGroup就会发射triggered()信号。通常情况下,组内的每个action发射自己的triggered()信号。

    正如上面提到的,action group默认是互斥的;它确保在同一时刻只有一个action会被选中。如果你想创建一个action group而不想时它们是互斥关系,那么你可以通过调用setExclusive(false)来关闭互斥关系。

    可以使用addAction()函数将action添加到action group中,然而更常见的做法是在创建action的时候指定一个group;这确保了这些actions具有同一个父亲。可以通过在group中添加分割线使得各个action分开显示,可以使用QAction的setSeparator()添加分割线。通常使用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);

    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

    为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()));

    }

    运行效果:

    备注:

    1、放置到ActionGroup中就默认是exclusive。

    2、是否出现选中的标志"小圆点"是通过设置setcheckable完成的。两者并无联系。

    关于QActionGroup的使用,我发的一个帖子中有提到,再次感谢网友jdwx1

    三、QWidgetAction类详解

    【详细描述】

    QWidgetAction通过接口方式继承自QAction,用于将自定义的widget插入基于action的容器,例如工具栏。

    出现在应用程序中的绝大多数的actions都是代表了一个菜单项或工具栏中的一个按钮。然而有时候我们也许要复杂一点的widgets。例如,字处理程序工具栏中使用QComboBox实现zoom action,实现不同程度的缩放。QToolBar提供了QToolBar::insertWidget()函数可以十分方便的将单个widget插入到合适的位置。然而,如果你想在多个容器中实现自定义widget的action,那么你就必须实现QWidgetAction的子类。

    如果QWidgetAction添加到QToolBar,那么就会调用QWidgetAction::createWidget()。我们可以重新实现这个函数创建自定义的widget。

    如果将一个action从容器widget上删除,那么就会调用QWidgetAction::deleteWidget(),调用该函数的参数就是上面创建的自定义widget。该函数的默认实现是将widget隐藏,然后使用QObject::deleteLater()删除它。

    如果你只有一个自定义的widget,那么你就可以使用setDefaultWidget()函数将它设置为默认的widget。那么以后当action被添加到QToolBar上时,就会自动将该自定义的widget添加到QToolBar上。如果将仅有一个默认widget的QWidgetAction同时添加到两个工具栏上,那么仅有第一个添加才会显示出来。QWidgetAction接管了默认的widget。

    注意:这取决于widget激活action,例如重新实现鼠标事件处理者,然后调用QAction::trigger()。

    Mac OS X:在Mac OS X上,如果你将一个widget添加到应用程序菜单栏的某个菜单上,那么该widget可以显示出来,并且可以实现功能,只是有一些限制:

    1、该widget的父对象不再是QMenu而是原生的菜单视图。如果你在其他地方显示菜单(例如作为一个弹出菜单),那么该菜单不会显 示在你期望的地方;

    2、针对该widget的Focus/Keyboard处理不再可用;

    3、由于Apple的设计,该widget的鼠标轨迹暂时不可用;

    4、将triggered()信号链接到打开模态对话框的槽函数上会导致应用程序崩溃(在Mac OS X10.4,这被告知是Apple的一个BUG),一个规避的方法是使用QueuedConnection代替DirecConnection。

    【示例】

    本示例代码来自: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();

    转自:http://qiusuoge.com/12287.html

    展开全文
  • } void MainWindow::create_actions_() { action_about_ = new QAction(tr("About"), this); connect(action_about_, &QAction::triggered, this, &MainWindow::about_); } void MainWindow::create_menus_() { ...

    I'm building a simple C++ application on Mac OS X 10.9 with Qt 5.2.1 using CMake (without MOC).

    I am starting the executable from the command-line. The problem is that the menu bar is not showing up at all, the Terminal menu bar is still visible but not clickable. When I switch windows temporarily and then come back to the window of this application, I at least see the standard "application" menu with "About". The "About" action is now working and shows the dialog. The toolbar button also works as expected.

    What else I tried (and didn't work):

    using the pre-defined menuBar()

    use setMenuBar()

    new menuBar(0)

    menubar->setVisible(true)

    When I check the isVisible() it returns false, also if I set it to visible in the line before.

    I wonder whether the lack of using MOC can be the reason for this?

    Below I attached a reduced example.

    #include

    #include

    class MainWindow : public QMainWindow {

    public:

    MainWindow();

    private:

    void create_actions_();

    void create_menus_();

    void create_toolbar_();

    void about_();

    QMenuBar* menu_bar_;

    QMenu* file_menu_;

    QMenu* help_menu_;

    QToolBar* file_toolbar_;

    QAction* action_about_;

    };

    MainWindow::MainWindow() {

    resize(800, 600);

    create_actions_();

    create_menus_();

    create_toolbar_();

    }

    void MainWindow::create_actions_() {

    action_about_ = new QAction(tr("About"), this);

    connect(action_about_, &QAction::triggered, this, &MainWindow::about_);

    }

    void MainWindow::create_menus_() {

    menu_bar_ = new QMenuBar(this);

    file_menu_ = menu_bar_->addMenu(tr("&File"));

    menu_bar_->addSeparator();

    help_menu_ = menu_bar_->addMenu(tr("&Help"));

    help_menu_->addAction(action_about_);

    menu_bar_->setNativeMenuBar(true);

    }

    void MainWindow::create_toolbar_() {

    file_toolbar_ = addToolBar(tr("File"));

    file_toolbar_->addAction(action_about_);

    file_toolbar_->setIconSize(QSize(16, 16));

    }

    void MainWindow::about_() {

    QMessageBox::about(this, tr("About"), tr("FooBar"));

    }

    int main(int argc, char **argv) {

    QApplication app(argc, argv);

    MainWindow main_window;

    main_window.show();

    const int exit_code = app.exec();

    return exit_code;

    }

    CMakeLists.txt

    FIND_PACKAGE(Qt5Core)

    FIND_PACKAGE(Qt5Gui)

    FIND_PACKAGE(Qt5OpenGL)

    FIND_PACKAGE(Qt5Widgets)

    FIND_PACKAGE(Qt5Declarative)

    FIND_PACKAGE(Qt5MacExtras)

    ADD_EXECUTABLE(main main.cc)

    qt5_use_modules(main Core Gui Widgets Declarative MacExtras)

    Thanks a lot in advance!

    解决方案

    OK, solved the problem myself. It appears you cannot add a separator to the menubar.

    Removing the menu_bar_->addSeparator(); solved the problem.

    展开全文
  • QAction类提供了抽象的用户界面32313133353236313431303231363533e58685e5aeb931333339663335action,这些action可以被放置在窗口部件中。应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于...
  • #include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ openAction = new QAction(tr("&open"),this); openAction->...
  • 我试图用一种非常模块化的方法来开发一个命令应用程序,我想这会很好,因为我使用的是pyqt,使用QAction来绑定命令的快捷方式。然而,似乎只有当动作在菜单或工具栏中可见时,动作快捷键才起作用。有人知道一种方法...
  • } void KoriganEngine::KG_createMenuActions(){ m_newProjAction = new QAction("New Project...", this); m_newProjAction->setShortcuts(QKeySequence::New); m_newProjAction->setStatusTip(QString("Create a ...
  • 在需要向菜单栏和工具栏中添加一些按钮或者控件时,发现找到一个可以使用的按钮或控件, 这些需要使用一个QAction的对象来替代。 添加的方法其一是在源代码中添加QAction,并设计其属性以及信号槽;其二可以直接...
  • 正题   问题如题。 解决办法: 将用到的图像文件复制到exe...在设置QAction时选择图像文件路径变为“从资源文件”,如下:(如何添加资源文件随便搜一下,都有,就说啦) 成功解决,如下图: 注:图像文件的...
  • 有时需要对QAction的文字显示做一些要求,如文字左对齐显示、文字显示在图标(QIcon)上下左右方位等。 查询了QAction的方法,并没有这样的属性实现,而且QAction本身的图标具有强制性,设置也占位置(自己测试如此...
  • 在学习Qt 菜单和工具栏设置图标的过程中,发现无论怎么设置,更改图片资源,都显示图片,然后就进行了以下步骤,解决了该问题: 1、构建 -> 清理项目; 2、构建 -> 构建项目; 3、构建 -> 执行qmake; 4、...
  • QMenu: 菜单栏里面菜单,可以显示文本和图标,但是并负责执行操作,有点类似label的作用 QAction: Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件。 ...
  • QMenu:菜单,可以显示文本和图标,但是并负责执行操作 QAction: 负责执行操作的部件 QStatusBar:负责提示的状态栏,通常在窗口最下侧 一、通过设计器添加菜单栏和状态栏 参考大神博客:Qt添加菜单栏和工具栏 ...
  • 我遇到麻烦,显示从当前图标主题中选择的QAction的图标.我用Qt设计师做了ui,并用pyuic4 sample.ui> sample.py.使用self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8(“document-open”)))设置主题图标后,...
  • QMenu没有显示

    千次阅读 2013-04-12 12:49:39
    QMenu和QAction没有显示,明明在头文件里有写QAction actSetting;在自己的创建菜单栏的函数里引用MenuBar()函数创建了QMenu,但就是没有显示我的菜单。还在我qmake -tp vc后出现莫名的找到函数符号之类的问题。 ...
  • QMainWindow有自身的ToolBar,可以添加QAction或QToolButton,并且都支持:当窗口缩小(缩小到工具栏按钮显示不全),这时工具栏右侧会出现“>>”按钮,点击该按钮工具栏会变高,隐藏的按钮会在第二行显示。...
  • QMenu 菜单,文本显示处理菜单操作 QAction 用来执行菜单动作 效果: 代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> MainWindow::MainWindow(QWidget *...
  • 这功能很好写,调用QPushButton的setMenu方法即可,但是,这种点击按钮弹出菜单的效果是很爽的,需要两次点击才弹出菜单,第一次点击按钮右侧出现箭头,第二次点击才弹出菜单,而且菜单不是居中显示,这些问题该...
  • **模态对话框:**在最上层对话框前,能操作后面的对话框 **非模态对话框:**在最上层对话框前,能操作后面的对话框 在上节课基础上,在菜单栏中创建一个模态对话框和一个非模态对话框 新建文件: 添加菜单: QMenu...
  • Qt 之 QToolButton

    万次阅读 多人点赞 2016-06-27 20:03:03
    工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标。简述 详细描述 常用接口 更多参考详细描述当使用QToolBar::addAction()添加一个新的(或已存在的)QAction至工具栏时,工具按钮通常被创建 。也可以用...
  • QMenu:菜单栏里面菜单,可以显示文本和图标,但是并负责执行操作,有点类似label的作用 QAction: Qt 将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件。 ...
  • 安装Qt5 (一)

    千次阅读 2015-06-07 13:27:05
    我想给菜单的每一项前面都加个图标,菜单条目用的QAction,但是QAction使用的ICon小图标无法显示,运行后菜单的各项前面倒是空出了图标的位置,却显示图标.开始以为是自己代码的实现有错,于是将QAction添加图片的两...
  • 6.这时软件自动添加基本的头文件,因为这个程序我们需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程中的所有...
  • QMenu的自定义内容

    2019-12-26 10:10:23
    @[TOC]QMenu的自定义内容 QMenu的作用 QMenu很常用,也很方便,可以替代很多弹出框,...1、为什么QWidget放在QWidgetAction里面,QMenu不显示? 我需要用到一个自定义的widget放入到QMenu中,但是一直都不显示效果。...
  • qt菜单栏ui设计

    2019-09-27 08:18:34
    一、菜单栏总体概况 ...QMenu: 菜单项(file edit help),可以显示文本和图标,但是并负责执行操作 QAction: 下拉菜单(new open save.....)负责执行操作的部件 1.3 关键步骤  创建菜单...
  • 通过QToolBar的QAction *QToolBar::addWidget(QWidget *widget)方法添加的控件,是能够用控件自身的hide和show方法来隐藏和显示控件自身的。 通过QAction::setVisible(bool)方法来设定QToolBar中控件的显示和隐藏...
  • 一般的情况下有工具栏的都用...QToolButton添加到ToolBar后它本身的一些属性就能用了,我向实现有外围设备插入后在工具栏显示图标,设备移除后图标也相应的移除,如果哦是用QAction还好弄,只要用QAction的函数 vo
  • Qt之QToolButton

    2016-06-27 20:03:00
    工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标。 简述 详细描述 常用接口 更多参考 详细描述 当使用QToolBar::addAction()添加一个新的(或已存在的)QAction至工具栏...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

qaction不显示