【Qt】信号槽的三种连接语法

这篇具有很好参考价值的文章主要介绍了【Qt】信号槽的三种连接语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Qt】信号槽的三种连接语法

实现观察者模式,可以使用函数回调,但注册回调函数有一定局限,安全性也没有保证。所以一定程度上可以说 Qt 信号槽是对回调机制进行了封装。

Qt 的信号槽能够连接(connect) 和编译通过,需要满足两个条件

  1. 信号的参数个数大于等于槽函数
  2. 信号槽的参数个数相同的部分,参数类型必须一一对应

创建信号槽连接,有以下三种方式

1. 使用 ui 界面控件

第一种,使用 ui 界面上的控件,通过右键 -> 转到槽,则会在对应界面的 cpp 生成类似以下函数名称的代码

void MainWindow::on_pushButton_clicked()
{
  
}

on_WidgetName_SignalName

on + 控件名称 + 信号名称

此种方式生成槽函数,编译时不进行检查,在运行时连接,通过 Qt 自身 moc (meta object compiler) 系统的反射机制来连接两个函数。

所以在控件名称修改时,在运行时会提示连接失败。

另一个缺陷是这种连接方式也不方便维护,连接(connect)和解除连接(disconnect)都不在可控范围内。

2. Qt4 的连接语法

第二种方式,使用 Qt4 语法的连接,也就是使用宏扩展, 本质上还是利用字符串的反射机制,示例:

connect(sender, SIGNAL(sigfunc()), receiver, SLOT((slotfunc()));

connect 的四个参数为:发送者对象指针,SIGNAL(发送者信号函数),接收者对象指针,SLOT(接收者槽函数)

如果查看 SIGNAL, SLOT 这两个宏的实现,就可以注意到这两个宏是将函数名称转换为字符串

#ifndef QT_NO_META_MACROS
#ifndef QT_NO_DEBUG
#define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
#ifndef QT_NO_KEYWORDS
#	define METHOD(0)  qFlagLocation("0"#a QLOCATION)
#endif
# define SLOT(a) qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
#else 
# ifndef QT_NO_KEYWORDS
#  define METHOD(a)  "0"#a
# endif
# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
#endif

# 号用于将其后面的宏参数进行字符串化, 也就是说对它之后的变量通过替换后再其左右各加上一个双引用。

slot 槽函数以 “1” 打头,signal 信号函数以 “2” 打头。QT_STRINGIFY 宏的定义也是单井号的使用

#define QT_STRINGIFY2(x) #x
#define QT_STRINGIFY(x) QT_STRINGIFY2(x)

但相较第一种方式,此种方式编译阶段做了字符串形式的参数一致性检查。

缺点是无法确认类中是否包含此函数,可以在两个宏中放入两个参数匹配但根本不存在的函数,一样能在编译期间顺利通过编译检查,却在运行时提示连接失败。

3. Qt5 的连接语法

第三种,Qt5 中提供了函数指针形式的 connect 语法,示例:

connect(sender, &Sender::signal, receiver, &Receiver::slot);

类名加函数取地址,确保了编译器检查信号与槽函数是否匹配,可以减少运行时出现连接失败的情况。

还有一种 lambda 表达式的变体,也是使用函数指针的方式来连接

connect(sender, &Sender::signal, [](){
  //... implement of slot
});

但 Qt5 语法中如果出现信号或槽函数重载,或两者都有重载的情况下,connect 不会智能匹配,重载情况下直接使用,编译会报错,错误信息如下:

no matching member function for call to 'connect'

调用 connect 没有匹配的成员函数

可以使用 Qt 的 QOverload 来处理,假如有以下信号和槽函数

signals:
  void sigfunc(int);
  void sigfunc(QString);
//...
public slots:
  void slotfunc(int);
  void slotfunc(QString);

连接时可以使用QOverload<T>::of ,示例:

connect(sender, QOverload<int>::of(&Sender::sigfunc), 
	receiver, QOverload<int>::of(&Receiver::slotfunc));

connect(sender, QOverload<QString>::of(&Sender::sigfunc), 
	receiver, QOverload<QString>::of(&Receiver::slotfunc));

来分别连接信号和槽函数的重载 (int, QString)文章来源地址https://www.toymoban.com/news/detail-642985.html

到了这里,关于【Qt】信号槽的三种连接语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt中信号槽的介绍及使用方法

    目录 三、信号槽 1. 信号槽的概念 2. 函数原型 2.1 自带信号 → 自带槽 2.2 自带信号 → 自定义槽 2.3 自定义信号 3. 参数传递 3.1 全局参数 3.2 信号槽传参 4. 对应关系 4.1 一对多 4.2 多对一 在之前的学习中,可以实现简单的UI效果,但是按钮不能点击。如果让按钮能在用户点击后

    2024年02月09日
    浏览(38)
  • QT的信号槽的四种写法和五种链接方式

    目录 四种信号槽写法: 五种连接方式: 实例: 常见错误及改正: 错误1: 未连接信号与槽 错误2: 信号和槽参数不匹配 错误3: 未使用Q_OBJECT宏 错误4: 跨线程连接未处理   在Qt中,信号(Signal)和槽(Slot)是一种用于对象之间通信的机制,用于实现一种松耦合的方式。信号被

    2024年02月13日
    浏览(42)
  • 关于一个QT程序的简单破解思路(不需要分析信号和槽的方法,通用所有程序的破解思路)

    几年前,公司买了台国产贴片机,里面的主程序是QT编写,运行在WINDOW XP系统上。主程序打开的界面,如图: 我来简单介绍下程序界面,各位读者不需要搞明白功能,只要知道大体的流程即可。 一、左边的列表: 贴片生产文件,里面包括了贴片时元器件的坐标、飞达安装的元器件类型、

    2024年01月24日
    浏览(42)
  • Qt中使用OpenGL的三种方式

    1.继承QOpenGLWidget并重写基类如下函数  通过使用QOpenGLContext来操作OPENGL函数   2. 继承QOpenGLFunctions类可直接使用OPENGL函数   直接使用OPENGL函数  3. 继承QOpenGLWidget 与QOpenGLExtraFunctions  在OPENGL中使用Shader 最终效果 

    2024年02月14日
    浏览(52)
  • Qt comboBox控件的三种基本用法

    1、用法一: 一般用到控件comboBox的基本用法是获取当前的值: 1.currentIndex(); 获取当前comBox的索引,是int类型的值。 2.currentText(); 获取当前comBox的文本,是QString类型。 2、用法二: 可以通过以下两种方式来通过切换comobox的值来执行一些指令: 1、通过首先在界面上拖入控件

    2024年02月12日
    浏览(43)
  • QT中使用QtXlsx库的三种方法 QT基础入门【Excel的操作】

    对于Linux用户,如果Qt是通过“ apt-get”之类的软件包管理器工具安装的,请确保已安装Qt5开发软件包qtbase5-private-dev QtXlsx是一个可以读写Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。该库可用于从头开始生成新的.xlsx文件从现有.xlsx文件中提取数据编

    2024年02月12日
    浏览(47)
  • Qt系列——点击按钮关闭窗口的三种实现方式,附源码

    主要实现了点击QPushButton按钮,关闭窗口的功能。 简单设计界面如下,按钮名称如图中右侧红框中内容 源程序连接

    2024年02月11日
    浏览(53)
  • QT信号槽连接方式

    1.QT信号槽主要分两个连接方式,手动和自动: 1.1 使用 connect() 函数手动连接信号和槽: QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot())); 自动: 1.2 使用 lambda 表达式连接信号和槽: connect(sender, Sender::signal, ={ receiver-slot(); }); 1.3 通过使用 QMetaObject::connectSlotsByName() 函数自动

    2024年02月12日
    浏览(38)
  • Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

    目录 1、创建项目 2、将.ui文件生成.py文件 2.1、Eric 6编译 ​2.2、Python命令行编译 ​2.3、脚本编译 3、界面、逻辑分离思想 在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Pytho

    2024年02月03日
    浏览(46)
  • qt信号和槽避免多次连接

    qt同一个信号和槽多次连接,则槽函数 会触发多次 (默认),可能不是我们想要的结果。 有3种方法可以解决这个问题: 因为初始化函数在在整个程序中只运行一次,所以这里面连接信号和槽,就能避免重复连接问题了。 Qt::UniqueConnection 的作用是:如果该信号以前没连接过

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包