首页 > 其他分享 >Qt QPushButton 点击信号分析

Qt QPushButton 点击信号分析

时间:2024-01-31 18:13:55浏览次数:32  
标签:触发 clicked Qt 点击 pressed QPushButton 按钮 toggled

QPushButton有三个很重要的信号跟点击有关

  • pressed
  • clicked
  • toggled

表面上看,pressed和clicked都会在点击按钮时触发,它们有什么区别呢?toggled好像有时候触发,有时候不触发,到底怎么回事呢?下面就一起聊一下这三个信号

首先,这三个信号都是从QAbstractButton继承来的,也就是说,下面情况对QAbstractButton的所有子类都适用,

1.先来看第一个问题
pressed和clicked,可以编写一段代码来测试一下

1 QObject::connect( ui->pushButton,&QToolButton::clicked,[]{
2     qDebug()<<"clicked";
3 });
4 QObject::connect( ui->pushButton,&QToolButton::pressed,[]{
5     qDebug()<<"pressed";
6 });

运行后点击按钮,结果为

1 Debugging starts
2 pressed
3 clicked
4 pressed
5 clicked
6 pressed
7 clicked

也就是说pressed先触发(按下),clicked后触发(弹起),而且如果将鼠标按压按钮,按住不动会发现只输出了“pressed”,直到放手弹起按钮,才会输出“clicked”

另外,如果在pressed 对应的槽函数中打断点,会发现断点运行后并不会执行“clicked”,这种情况跟我们在鼠标按下事件和鼠标弹起事件中同时打断点的情况一样,调试按下触发的代码后,弹起的事件代码不会触发。

2.再来看第二个问题

帮助文档里面写着按钮状态变化的时候,这个信号会触发,所以这个信号触发的前提是按钮的Checkable属性要设置成true,这样在点击按钮之后就会触发toggled信号

测试代码如下:

那么还有一个问题 pressed和clicked,和toggled 的先后顺序又是怎样的,我们将两段测试代码同时添加,运行之后点击按钮,结果:
 1 Debugging starts
 2 pressed
 3 toggled true
 4 clicked
 5 pressed
 6 toggled false
 7 clicked
 8 pressed
 9 toggled true
10 clicked
11 ...

结论:

  1. pressed最先执行,相当于按下操作
  2. 按下之后,按钮状态发生变化,触发toggled
  3. clicked最后执行,相当于弹起操作

标签:触发,clicked,Qt,点击,pressed,QPushButton,按钮,toggled
From: https://www.cnblogs.com/ybqjymy/p/17999854

相关文章

  • 使用 PyQt5(PySide2)+SQLAlchemy 做一个登录注册页(一)
    使用PyQt5(PySide2)+SQLAlchemy做一个登录注册页(一)本文将介绍自己用PyQt5+SQLAlchemy做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将PyQt5改为PySide2以获得更宽松的开源协议本文由于涉及到的代码较多,将会是......
  • Qt VS环境 Designer 没有“转到槽”项
    在VS环境下进行QT编程时,QTDesigner没有“转到槽”选项,比较蛮烦。原因:“转到槽”是QTCreater的功能,QTDesigner下,可通过如下方式实现:......
  • Visual Studio进行Qt开发时Qt Designer没有“转到槽”选项的问题
    问题描述:在使用QtCreator进行界面设计时,只需要在控件上右击便会出现“转到槽”选项,从而可以进行槽函数的编写与槽函数和信号的自动连接,十分方便。但在使用VS进行Qt开发时,QtDesigner没有这个选项。解决方法:1.自己定义信号和槽并手工连接:qvtk_demo.h:1#pragmaonce2......
  • Visual Studio 2015+Qt编程,如何使用qDebug()打印出信息
    问题:VisualStudio2015+Qt编程,调试程序的时候,使用qDebug()发现在vs的输出界面没有打印出qDebug()的信息。找到了最容易的解决办法(此方法只可以解决此解决方案的):1.项目文件名那里鼠标右键,点击属性,打开属性页 2.找到连接器->系统->子系统 3.将子系统由窗口改为控制台,点击......
  • Visual Studio 2022 + Qt 中文乱码问题
    使用Qt编译中文标题出现乱码问题如下图首先打开文件属性->点击(C/C++)->点击(所有选项)->找到(附加选项)这一栏修改为(/UTF-8)注意大小写  然后在头文件中添加以下代码:1#if_MSC_VER>=16002#pragmaexecution_character_set("utf-8")3#endif即可解决问题......
  • SciTech-CG-Graphics-Chart-CodeGenerator-PyQtGraph: 基于PyQt的图形绘制以及应用库
    UMLclassdiagram:https://pyqtgraph.readthedocs.io/en/latest/api_reference/uml_overview.htmlFlowChart:https://pyqtgraph.readthedocs.io/en/latest/api_reference/flowchart/index.htmlTheStateMachineFramework¶:https://doc.qt.io/qtforpython-5/overviews/......
  • Qt 解决qtcreator工程文件例程报错error: cannot initialize object parameter of typ
    qt下载好并且环境配置完成,kits和qt都已配置完成在qtcreator中,在终端手动编译qmakemake都完全没问题,但是在qtcreator中却报错。即使是新建工程例程都报错。版本qt5.6.0qtcreator4.11.0报错main.cpp:96:error:cannotinitializeobjectparameteroftype‘QWidget’wi......
  • Qt cannot initialize object parameter of type ‘QWidget‘ with an expression of
    报错如图:qtcreator工程文件例程报错error:cannotinitializeobjectparameteroftype‘QWidget’withanexpressionoftype‘tab_workface’问题分析可能因为qtcreator4.11.0basedonqt5.12版本略微冲突导致。。问题解决帮助->关于插件,将ClangCo......
  • springboot集成mqtt
    SpringBoot集成MQTT(简单版)一、docker安装emqx环境(Linux系统)emqx:mqtt服务器(broker)version:'3'services:emqx:image:emqx/emqxcontainer_name:emqxrestart:alwaysports:-8001:18083-8002:1883-8003:8083-8004......
  • Qt error C1083:无法打开文件stddef.h或crtdbg.h
    问题描述环境:QT5.15.2从别的电脑拷过来一个能跑的项目在新安装的qt上运行,报错C1038,检查发现报错的文件都跟sdk有关,问题就是不能正确找到SDK相关的。解决1.查找SDK(我是用的"everything"工具搜索的,一般都会在这个路径下面) 在这几个文件夹中选择最新的那个,点进去,里边......