首页 > 其他分享 >Qt 默认静态槽函数 connectSlotsByName浅析

Qt 默认静态槽函数 connectSlotsByName浅析

时间:2023-03-06 21:01:34浏览次数:38  
标签:函数 浅析 connect 信号 QObject connectSlotsByName Qt

Qt 默认静态槽函数 connectSlotsByName浅析

Qt中生成槽函数的方式

在Qt中有3种生成槽函数的方式:

  • 第一种就是手动写connect连接函数,函数原型如下:

    //connect(信号的发送者,信号的具体信息,信号的接受者,信号的处理[槽])
    [static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
    
  • 第二种就是在qt设计师界面,下方手动点击绿色的+按钮添加信号和槽函数,其生成的connect连接函数生成在ui_widget.hsetupUi()末尾。如:

    QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));
    
  • 第三种就是在qt设计师界面,右键控件,点击转到槽/Go to slot,系统会自动生成 on_xxx函数,该函数会自动在.h文件和.cpp文件中声明和实现(函数体当然是自己写)。

    转到槽

本文针对第三种自动生成的槽函数进行分析。

QMetaObject::connectSlotsByName()

上文提到的第二种方式并不会在普通的项目文件中生成signalslot的连接,而是生成在ui_widget.h文件里。

在ui_widget.h文件中的setupUi()函数末尾有这么一句:

QMetaObject::connectSlotsByName(MainWindow/Widget/Dialog);

Qt助手中给出的函数原型是:

[static] void QMetaObject::connectSlotsByName(QObject *object)

功能:递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到以下形式的对象插槽:

void on_<object name>_<signal name>(<signal parameters>);

如果对象本身具有正确设置的对象名称,则其自身的信号也将连接到其各自的插槽。

举例

假设我们的对象有一个类型为QPushButton的子对象,对象名为button1。捕捉按钮的clicked()信号的槽是:

void on_button1_clicked();

总结

综上所述,只要槽函数名规则是这样的:on_子对象名_信号名,如:

public slots:
   void on_actionNew_triggered();

就可以不用手写connect函数来连接信号和槽了!

但很明显,这种方式的局限性是只能绑定出信号和槽的一对一关系,如果要实现一个信号可以有多种槽函数响应则无法用这种方法,还是得手写connect()

如果一定要用这种自动生成的与名字绑定的槽函数实现多个槽函数响应1个信号,可以直接复制写好的函数体,或者在函数体内调用写好的槽函数。

需要注意

  1. 尽量不要让QObject出现相同的objectName
  2. 对于自定义的槽函数进行手动连接时,不要以on_开头,养成良好的习惯
  3. 如果同名,connectSlotsByName()只会给其中一个建立缺省的信号槽的连接

标签:函数,浅析,connect,信号,QObject,connectSlotsByName,Qt
From: https://www.cnblogs.com/3to4/p/17185426.html

相关文章

  • Qt音视频开发20-vlc内核动态保存录像文件(不需要重新编译源码)
    一、前言在vlc默认提供的保存文件方式中,通过打开的时候传入指定的参数来保存文件,直到关闭播放生成文件,这种方式简单暴力,但是不适用大部分的场景,大部分时候需要的是提供开......
  • qtav播放采集卡
    打印提示这个,"[email protected]:282907.014"搜索代码qDebug("delay%fs@%.3fspts:%.3f",diff,d.clock->value(),pkt.pts);F:\qt-project\QtAV\src\V......
  • QT主窗口关闭,同时关闭打开的子窗体
    1、主窗口关闭,主窗口上的dock窗口不需要特殊处理也会关闭,直接退出主程序。2、主窗口关闭,需要在所有子窗口(单独new出来的非dock窗口)的构造函数中添加代码 this->setAttrib......
  • Pycharm配置pyqt5
    关于PyQt5,在pycharm上的安装步骤及使用技巧(最重要)https://www.cnblogs.com/pywjh/p/9835931.html importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindowf......
  • qt中文件读一行操作
     windows平台下也就是回车换行。此外:QT帮助文档中对QIODevice::Text描述是说在读取时,将行结束符转换成\n;在写入时,将行结束符转换成本地格式,例如Win32平台上是\r\n......
  • Qt学习笔记 - 第一章 - 快速开始、信号与槽
    Qt学习笔记全系列传送门:【本章】Qt学习笔记-第一章-快速开始、信号与槽Qt学习笔记-第二章-添加图片、布局、界面切换目录1、Qt工程创建2、工程文件......
  • QT QTableWidget 设置每一列的宽度(大概可以实现)
    //第一个参数代表:第几列,第二个参数:代表要进行的操作(对内容进行调整,或者,添加拉伸达到拉长表格的效果)ui->tableWidget->horizontalHeader()->setSectionResizeMode(......
  • 浅析概率、期望、方差、分布
    浅析概率、期望、方差、分布目录浅析概率、期望、方差、分布更好的阅读体验戳此进入概率定义基本公式全概率公式贝叶斯公式独立事件两事件间的独立多个事件之间的独立零阶......
  • 浅析线性代数
    浅析线性代数目录浅析线性代数更好的阅读体验戳此进入写在前面矩阵定义与运算单位矩阵矩阵快速幂矩阵快速幂优化DP高斯-约旦消元矩阵求逆线性基矩阵的转置定义UPD更好的......
  • 浅析SAM
    浅析SAM目录浅析SAM更好的阅读体验戳此进入写在前面一些事实相同子串个数例题#1LG-P3804【模板】后缀自动机(SAM)定长子串可重复字典序排序例题#2[ABC272F]TwoStr......