【Qt】浅析QAction的事件触发机制 - triggered和toggled

2024-05-28 1183阅读

目录

  • QAction
    • QAction是什么?为什么要用它?
    • triggered和toggled是什么意思?两者什么时候触发?
    • QAction->setCheckable(true)
    • QActionGroup
      • QActionGroup对triggered和toggled有什么影响?
      • QActionGroup->setExclusive(false)
      • setChecked函数与它们是什么关系?
      • isChecked状态与信号是什么关系?
      • 附录:案例代码

        QAction

        QAction是什么?为什么要用它?

        我们可以把对按钮的一次点击、对下拉菜单的一次选择抽象理解成对QAction的一次操作。使用QAction时,我们不需要关心绘制出来的UI是button还是menu还是啥。

        它有一个我很喜欢的功能。就是,QAction能够配合QActionGroup使用,类似于元素与集合的关系,用来实现互斥选择的效果。就像这样:

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        开发中,我会偷懒把QAction对象命名为act。下文的示例代码也如此。

        triggered和toggled是什么意思?两者什么时候触发?

        我是真不会翻译这俩。但我可以类比。

        大家可以把QAction想象成一把枪。

        你点一次按钮,就是扣动一下扳机,就是trigger()一下,接着自动触发信号triggered。

        如果这是一把高科技赛博枪,你只需要扣动一次,它就可以一直打击,你再扣动一次,它就停止打击。那么,扣第一次触发信号toggled(true),扣第二次触发信号toggled(false)。

        QAction->setCheckable(true)

        细心的你可能会留意到,信号triggered的定义是这样的:

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        它有一个bool类型的参数。但无论我们怎么点,参数checked一直是false(最后打印0)。

        QToolButton* btn1 = new QToolButton(widget);
        btn1->setDefaultAction(act1);
        QToolButton* btn2 = new QToolButton(widget);
        btn2->setDefaultAction(act2);
        

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        这是因为QAction默认不是checkable的。

        一个按钮是否是checkable的区别在于,它是一个门铃还是一个吊灯开关。

        默认按钮 - 门铃checkable按钮 - 开关
        【Qt】浅析QAction的事件触发机制 - triggered和toggled【Qt】浅析QAction的事件触发机制 - triggered和toggled

        我们添加以下2行代码,将QAction设为checkable:

        act1->setCheckable(true);
        act2->setCheckable(true);
        
        运行结果:

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        1. 因为checkable的存在,toggled信号终于能被触发了。
        2. toggled 优先 于triggered触发
        3. triggered的参数会根据 action当前的 checked状态传true或false。

        QActionGroup

        QActionGroup对triggered和toggled有什么影响?

        QActionGroup默认是IsExclusive() == true,排他的,单选的。

        添加以下代码:

        QActionGroup* group = new QActionGroup(widget);
        group->addAction(act1);
        group->addAction(act2);
        

        运行,先点击按钮1,然后点击按钮2,再次点击按钮2:

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        可以看到,triggered的参数永远地变成true了。

        因为QActionGroup的作用,我们每次只能启用一把枪。当act2被扣下时,act1就会被自动停用。对于已经启用的枪,我们再次点击,并不会使它停用;虽然状态上没有任何改变,但triggered信号会被发送第二次。

        QActionGroup->setExclusive(false)

        添加以下代码:

        group->setExclusive(false);
        

        效果和QActionGroup不存在时是一样的

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        setChecked函数与它们是什么关系?

        既然group->setExclusive(false);和QActionGroup不存在时是一样的,那就没有研究下去的必要噜~

        所以我们把这行代码删掉。

        添加以下代码:

        QPushButton* btn3 = new QPushButton("check btn1");
        connect(btn3, &QPushButton::clicked, [=]() {act1->setChecked(true); });
        QPushButton* btn4 = new QPushButton("check btn2");
        connect(btn4, &QPushButton::clicked, [=]() {act2->setChecked(true); });
        layout->addWidget(btn3);
        layout->addWidget(btn4);
        

        【Qt】浅析QAction的事件触发机制 - triggered和toggled

        setChecked函数可以触发toggled,但不能触发triggered。triggered只能由trigger()函数或者用户点击触发。

        isChecked状态与信号是什么关系?

        先改变状态,再触发信号。信号的bool checked参数表示的是改变后的状态。

        附录:案例代码

        QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
            : QMainWindow(parent)
        {
            QWidget* widget = new QWidget(this);
            QAction* act1 = new QAction(widget);
            act1->setText("1");
            connect(act1, &QAction::triggered, this, [=](bool checked) {
                cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]