Qt信号和槽的个人总结(★firecat推荐★)

简介: Qt信号和槽的个人总结(★firecat推荐★)

1、connect


[cpp] view plaincopy


connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));  

这里用到了两个宏:SIGNAL() 和SLOT();通过connect声明可以知道这两个宏最后倒是得到一个const char*类型。

在qobjectdefs.h中可以看到SIGNAL() 和SLOT()的宏定义:


[cpp] view plaincopy
#ifndef QT_NO_DEBUG  
# define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__)  
# define METHOD(a)   qFlagLocation("0"#a QLOCATION)  
# define SLOT(a)     qFlagLocation("1"#a QLOCATION)  
# define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)  
#else  
# define METHOD(a)   "0"#a  
# define SLOT(a)     "1"#a  
# define SIGNAL(a)   "2"#a  
#endif

所以这两个宏的作用就是把函数名转换为字符串并且在前面加上标识符。


比如:SIGNAL(read())展开后就是"2read()";同理SLOT(read())展开后就是"1read()"。


[cpp] view plaincopy


connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));  

实际上就是connect(sender,“2signal()”,receiver,“1slot())”;  


2、slots,signals


Qt4源码定义的宏如下:


# define slots


#define signals protected

# define emit


再来看例子:


#ifndef COUNTER_H
#define COUNTER_H
#include <QObject>
class Counter : public QObject
{
    Q_OBJECT
public:
    Counter();
private:
    int m_value1;
    int m_value2;
public slots:
    void setValue1(int value);
    void setValue2(int value);
signals:
    void valueChanged1(int newValue);
    void valueChanged2(int newValue);
};
#endif // COUNTER_H

注意,头文件定义的public slots和signals对C++编译器而言没有意义,会被替换成public和protected。他们的真实意图其实是给moc工具使用的,moc根据这些字符串关键字匹配,用来生成文件moc_Counter.cpp。Qt源码的构建过程是先moc转换然后再执行C++编译器。moc的目的是展开信号和槽,生成一个能让编译器读懂的源文件。

以下是生成的moc文件:

QT_BEGIN_MOC_NAMESPACE static const uint qt_meta_data_Counter[] = {


// content:        

     // revision //指明moc生成代码的版本号:Qt4的moc生成的代码,该值是6,也就是相当于moc v6;Qt5则是70,       // classname //类名的索引,在数组qt_meta_stringdata_Counter的起始下标是0        0,    0, // classinfo        4,   14, // methods //有4个函数(2个信号函数,2个槽函数);函数的描述在数组qt_meta_data_Counter的起始下标是14        0,    0, // properties        0,    0, // enums/sets        0,    0, // constructors        0,       // flags        2,       // signalCount //信号函数的数量


// signals: signature, parameters, type, tag, flags       18,    9,    8,    8, 0x05, //信号的索引,在数组qt_meta_stringdata_Counter的起始下标是18,flags:0x05表示是信号       37,    9,    8,    8, 0x05, //同上


// slots: signature, parameters, type, tag, flags       62,   56,    8,    8, 0x0a, //槽的索引,在数组qt_meta_stringdata_Counter的起始下标是62,flags:0x0a表示是槽


     77,   56,    8,    8, 0x0a, //同上


      0        // eod };


static const char qt_meta_stringdata_Counter[] = {     "Counter\0\0newValue\0valueChanged1(int)\0"     "valueChanged2(int)\0value\0setValue1(int)\0"     "setValue2(int)\0" };


 


相关文章
|
1月前
|
编译器
(9)Qt中信号与槽重载的解决方案
本文介绍了在Qt中处理信号与槽重载问题的三种解决方案:使用函数指针、Qt提供的QOverload类和Qt4的宏方式。
109 3
|
6月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
1986 4
|
6月前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
83 0
|
6月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
6月前
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
541 0
|
6月前
|
安全 编译器 开发者
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
209 0
|
1月前
(8)Qt中的自定义信号
本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。
77 3
(8)Qt中的自定义信号
|
21天前
|
C++
003 Qt_信号和槽-上
本文介绍了Qt中的信号与槽机制,包括信号和槽的概念、本质及连接方法,并演示了如何自定义槽函数。信号是事件的体现,槽是对信号的响应函数。通过信号与槽,可以将独立的控件关联起来,实现复杂的交互逻辑。文中还详细展示了如何在Qt项目中定义和使用槽函数,通过实例代码和图形化界面操作,帮助读者更好地理解和应用这一机制。
31 1
003 Qt_信号和槽-上
|
5月前
|
安全 C++ Windows
Qt信号与槽机制
Qt信号与槽机制
52 1
|
3月前
|
程序员 C++
【Qt】信号与槽(下)
【Qt】信号与槽(下)
下一篇
无影云桌面