Qt中槽函数触发两次的两种场景分析

    在Qt开发中,有两种情况能够触发槽函数被触发两次,第一种情况是必现的,属于错误的写法,是指信号和槽关联两次;第二种情况是偶然出现的,是指对信号没有正确理解导致的。

1.信号与槽关联两次

    通常这种情况下发生在混合编程的情况下,即既使用了UI来进行布局,又使用来代码来关联信号,使得信号和槽关联两次。不妨以QPushButton中的button为例,通常在使用ui文件布局中自动生成的文件中会调用这样一句话:

QMetaObject::connectSlotsByName();

这样则代表隐式调用connect(button, &QPushButton::clicked, this, &myWidget::on_button_clicked);此时开发者只需要实现on_button_clicked即可,如果再在代码中显示添加信号和槽连接,则会触发槽函数两次

 

2.QPushButton中的pressed,released, clicked信号

    通常这种情况发生在对信号的关联上,以QPushbutton为例,其他的如果有类似情况可以延伸,首先复现这种场景需要正确理解QPushButton中的三种信号:pressed指的是鼠标左键按下的动作,released指的是鼠标左键抬起的动作,clicked指的是鼠标左键按下并抬起的动作,因此触发优先级为pressed>released>clicked.

   考虑场景,关联pressed信号,测试鼠标快速点击button,点击button关闭对话框并打印进入对话框的次数,测试发现:在多次尝试后,会出现概率性的一次点击,进入两次对话框的情况,但是关联clicked信号却不会出现这种情况。

  避免情况:因此,如果不需要区分三种信号触发的优先级,建议在开发过程中尽量使用clicked信号。

你可能感兴趣的:(Qt)