【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-640739.html

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

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

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

相关文章

  • 20221210 QT----信号和槽的使用

    什么是信号(signal) 以QPushButton为例: (1)按下按钮时,会触发一个mousePressEvent事件,此时会发出一个pressed信号; (2)松开按钮时,会触发一个mouseReleaseEvent事件,此时会发出released和clicked信号。 事件的种类有很多,不同的事件都对应着不同的信号,当事件发生时,对应

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

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

    2024年02月11日
    浏览(50)
  • QT信号与槽的第五个参数

    1、Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。 2、Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,

    2024年02月13日
    浏览(48)
  • Qt中信号槽的介绍及使用方法

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

    2024年02月09日
    浏览(37)
  • 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日
    浏览(35)
  • Qt6入门教程 8:信号和槽机制(连接方式)

    目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 在调用a.setValue(12)时会发送valueChanged(12)信号,此时槽函数b.setValue(12)会

    2024年01月17日
    浏览(56)
  • QT中信号与槽机制的介绍,以及信号与槽连接的几种方式

    功能:实现多个组件之间的相互通信,是QT引以为傲的核心机制 信号:就是信号函数,定义在类体的signals权限下,是一个不完整的函数,只有声明没有定义; 槽:就是槽函数,定义在类体的slots权限下,是一个完整的函数,既有声明也有定义,也可以当做普通函数被使用 无

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

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

    2024年01月24日
    浏览(40)
  • Qt 多线程、信号和槽连接方式推荐connect(Sender,Singnal,Receiver,Slot,ConnectMode);如下图所示

    connect(主线程A,信号A,子线程B,槽函数B,DirectConnection /AutoConnection ); connect(子线B,信号B,主线程A,槽函数A,QueueConnection  );

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

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

    2024年02月12日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包