qt信号和槽

信号必须基于类(函数声明):

1.必须在QObject子类中声明

2.必须用signals关键字标记

3.必须添加Q_OBJECT

不一定基于类(函数实现):

Qt5 支持 Lambda、全局函数、静态函数等无类依赖的形式作为槽;

connect函数原型:

cpp 复制代码
template <typename PointerToMemberFunction>
static QMetaObject::Connection QObject::connect(
    const QObject *sender, 
    PointerToMemberFunction signal, 
    const QObject *receiver, 
    PointerToMemberFunction method, 
    Qt::ConnectionType type = Qt::AutoConnection);

第五个参数是一个枚举类型:

1.Qt::AutoConnection(默认):
  • 发送者与接收者在同一线程 :等效于DirectConnection
  • 发送者与接收者在不同线程 :等效于QueuedConnection
2.Qt::DirectConnection:
  • 适用场景 :发送者与接收者同线程的场景(如 UI 组件内部通信)
  • 工作机制 :信号发射时,立即在发送者的线程中直接调用槽函数(同步执行)
3.Qt::QueuedConnection(队列连接)
  • 适用场景 :发送者与接收者跨线程的场景(如主线程与工作线程通信)
  • 信号发射时,Qt 将槽函数调用封装为事件 ,放入接收者线程的事件循环队列中,等待事件循环处理(异步执行)
4.Qt::BlockingQueuedConnection(阻塞队列连接)
  • 适用场景 :需要同步等待槽函数执行结果的跨线程场景(如工作线程请求主线程数据)。
  • 工作机制 :是QueuedConnection的 "阻塞版"
5.Qt::UniqueConnection(唯一连接)
  • 适用场景 :防止多次调用connect导致重复触发槽(如动态创建组件时的连接)
  • 定义 :这不是独立的连接类型,而是修饰符 ,可与其他类型(如AutoConnection | UniqueConnection)组合使用
6.Qt::SingleShotConnection
  • 适用场景:只需响应一次的信号(如 "初始化完成" 信号)
  • 定义 :槽函数触发一次后,连接会自动断开,后续信号发射不再触发槽,也是修饰符

信号透传

直接 "信号连信号"。信号透传的核心价值是降低组件耦合度、提升代码可维护性,是中介者模式的体现
cpp 复制代码
#include <QWidget>
#include <QLineEdit>
#include <QDebug>

// 自定义搜索栏组件(子组件)
class SearchBar : public QWidget
{
    Q_OBJECT
public:
    explicit SearchBar(QWidget *parent = nullptr) : QWidget(parent) {
        // 内部子控件:输入框
        m_edit = new QLineEdit(this);
        
        // 核心:将内部输入框的信号直接透传到自身的自定义信号
        connect(m_edit, &QLineEdit::textChanged, this, &SearchBar::searchTextChanged);
    }

signals:
    // 对外暴露的透传信号(与源信号参数兼容)
    void searchTextChanged(const QString &text);

private:
    QLineEdit *m_edit;
};

// 主窗口(父组件)
class MainWindow : public QWidget
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        m_searchBar = new SearchBar(this);
        
        // 连接透传后的信号进行处理
        connect(m_searchBar, &SearchBar::searchTextChanged, this, &MainWindow::handleSearchText);
    }

private slots:
    void handleSearchText(const QString &text) {
        qDebug() << "搜索文本更新:" << text;
    }

private:
    SearchBar *m_searchBar;
};

元对象系统:信号和槽使用的条件

  1. QObject基础资格:给类提供使用元对象系统的 "入场券";
  2. Q_OBJECT需求标记:告诉 Qt"这个类需要信号槽、属性这些功能";
  3. moc代码生成器:根据标记,自动补齐实现这些功能所需的底层代码。

QThread:

继承并重写 run()通过start启动,只有run内的内容才是新线程执行的内容

moveToThread

主线程创建含槽函数的类,当移动到新线程后槽函数被触发执行于新线程,在主线程直接调用会执行于主线程

相关推荐
恋恋西风2 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx2 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_2 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_2 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu3 小时前
CSharp: 万年历
开发语言·后端·c#·.net
我找到地球的支点啦3 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
予昊3 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
weixin_461408584 小时前
Mybatis-flex小记
java·开发语言·mybatis
青梅味猪大肠5 小时前
【深入浅出C++】为什么虚表指针可以解决菱形继承
开发语言·c++
潘潘的嵌入式日记5 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机