首页| 论坛| 消息

标题:Qt信号槽源码剖析(一)
作者:it文艺男
日期:2021-04-10 15:51
内容:

大家好,我是IT文艺男,来自一线大厂的一线程序员
大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道;也就是说大家只知道怎么使用,却不知道基于什么原理,显然这是不符合深层次发展的;那么今天我就给大家基于Qt源码以及示例代码深度剖析Qt的信号槽机制,一定会对大家有帮助。

基本概念
信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。

用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。
信号与槽的连接
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *method,Qt::ConnectionType type = Qt::AutoConnection)
通过QObject::connect静态函数建立连接;其中sender与receiver是指向对象的指针,signal与method分别通过SIGNAL()与SLOT()宏来进行转换。
元对象编译器
MOC, the Meta Object Compiler。
Qt程序在交由标准编译器(例如MSVC)编译之前,先使用moc分析cpp头文件;如果它发现在一个头文件中包含了Q_OBJECT宏,则会生成另外一个cpp源文件(moc_文件名.cpp),该cpp源文件中包含了Q_OBJECT宏的实现、运行时信息(反射)等。因此Qt程序的完整编译过程为moc->预处理->编译->链接
示例代码
Counter.h文件
#pragma once
#include
class Counter : public QObject
{
Q_OBJECT
public:
Counter();
public:
int value() const;
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
Counter.cpp文件
#include "Counter.h"
Counter::Counter():m_value(0)
{
}
int Counter::value() const
{
return m_value;
}
void Counter::setValue(int value)
{
..

回复 发表
主题 版块