QT信号与槽

元对象系统

Qt 的元对象系统为对象间通信、运行时类型信息和动态属性系统提供了信号和插槽机制。

元对象系统基于以下三个方面:

  1. QObject 类为可以利用元对象系统的对象提供了一个基类。
  2. Q_OBJECT 宏用于启用元对象功能,如动态属性、信号和槽。
  3. Meta-Object Compiler(moc) 为每个QObject 子类提供实现元对象功能所需的代码。

moc 工具读取 C++ 源文件。如果发现一个或多个类的声明包含Q_OBJECT 宏,它就会生成另一个 C++ 源文件,其中包含每个类的元对象代码。生成的源文件可以#include'd到类的源文件中,或者更常见的是与类的实现进行编译和链接。

cpp 复制代码
#include <QObject>

class Counter : public QObject
{
    Q_OBJECT

// Note. The Q_OBJECT macro starts a private section.
// To declare public members, use the 'public:' access modifier.
public:
    Counter() { m_value = 0; }

    int value() const { return m_value; }

public slots:
    void setValue(int value);

signals:
    void valueChanged(int newValue);

private:
    int m_value;
};

Signals

当对象的内部状态发生某种变化,而对象的客户端或所有者可能对此感兴趣时,对象就会发出信号。信号是公共访问函数,可以从任何地方发出,但我们建议只从定义信号的类及其子类发出。

信号发出后,与之相连的槽通常会立即执行,就像普通函数调用一样。在这种情况下,信号和槽机制完全独立于任何图形用户界面事件循环。一旦所有插槽都返回,就会执行emit 语句后面的代码。使用queued connections 时,情况略有不同;在这种情况下,emit 关键字后面的代码将立即继续执行,而插槽将在稍后执行。

如果多个插槽与一个信号相连,则在信号发出时,这些插槽将按照连接的顺序一个接一个地执行。

信号由moc自动生成,不得在.cpp 文件中执行。

Slots

当与槽相连的信号发出时,槽就会被调用。槽是普通的 C++ 函数,可以正常调用;它们唯一的特点是可以连接信号。

信号和槽是松散耦合的:发出信号的类既不知道也不关心哪些槽接收信号。Qt 的信号和插槽机制确保,如果将信号连接到插槽,插槽将在正确的时间被调用信号的参数。信号和槽可以接受任意数量、任意类型的参数。它们是完全类型安全的。

相关推荐
码界筑梦坊几秒前
130-基于Python的体育用品销售数据可视化分析系统
开发语言·python·信息可视化·flask·毕业设计
码界筑梦坊2 分钟前
131-基于Flask的美国新泽西州自动售货机销售数据可视化分析系统
开发语言·python·信息可视化·数据分析·flask·毕业设计
努力努力再努力wz3 分钟前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
神仙别闹6 分钟前
基于MFC(C++)实现(界面)学委作业管理系统
开发语言·c++·mfc
三品吉他手会点灯6 分钟前
C语言学习笔记 - 41.数据类型 - scanf函数核心知识点复习
c语言·开发语言·笔记·学习
撩得Android一次心动7 分钟前
C语言基础笔记3【个人用】
android·c语言·开发语言·笔记
薇茗12 分钟前
【初阶数据结构】 升沉有序的平仄 排序 3
c语言·开发语言·数据结构·算法·排序算法·文件归并排序
字节高级特工14 分钟前
C++11(一) 革新:右值引用与移动语义
java·开发语言·c++·人工智能·后端
AI科技星19 分钟前
强哥德巴赫猜想(1+1)终极证明(2026 年5月 21 日)
开发语言·人工智能·算法·计算机视觉·量子计算
故事和你9124 分钟前
洛谷-【图论2-4】连通性问题2
开发语言·数据结构·c++·算法·动态规划·图论