讲师中心 微信公众号
AI工具推荐 视频效率加速

Qt自定义信号怎么写?

胖磊姑娘_7783

胖磊姑娘_7783

发布时间:2026-08-05 15:36:49

|

368人浏览过

|

来源于php中文网

原创

Qt中自定义信号需在QObject子类头文件的signals:区块内声明,返回void、不实现;用emit触发;通过connect连接槽函数,支持显式连接、自动连接和Lambda三种方式。

qt自定义信号怎么写? - php中文网

要在Qt中让两个不相关的类之间安全通信,比如子线程加载完资源后通知主线程更新UI,就必须自己定义信号——系统自带的信号覆盖不了这种跨线程、跨模块的业务场景。

自定义信号的声明位置和语法

在继承自QObject的类头文件(.h)中,把信号写在signals:关键字下方:

class Worker : public QObject
{
  Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:
    void taskFinished();
    void progressUpdated(int percent);
    void errorOccurred(const QString &msg);
};

【必须写在 signals: 区块内,且不能加 public/private 等访问修饰符】

信号函数只声明、不实现;返回值必须是 void;可以带参数,支持重载(比如同时声明 void dataReady(int) 和 void dataReady(QString))。

触发信号:emit 关键字怎么用

在类的成员函数(比如 run() 或某个处理逻辑函数)中,用 emit 触发信号:

void Worker::doWork() {
  // 模拟耗时操作
  for (int i = 0; i <= 100; i += 10) {
    QThread::msleep(100);
    emit progressUpdated(i);
  }
  emit taskFinished();
}

emit 是一个空宏,写不写都能编译通过,但强烈建议保留——它让代码意图一目了然,避免和普通函数调用混淆。

注意:不能在类外部直接 emit 某个对象的信号,必须通过该对象的成员函数调用 emit;也不能对 const 对象 emit 信号。

连接信号到槽的三种方式

方法一:使用 QObject::connect 显式连接(最常用、最清晰)

Worker *worker = new Worker(this);
QThread *thread = new QThread(this);
worker->moveToThread(thread);

// 主线程中连接
connect(worker, &Worker::taskFinished,
        this, &MainWindow::onTaskDone);
connect(worker, &Worker::progressUpdated,
        this, &MainWindow::updateProgress);

Qt Creator 18.0.2
Qt Creator 18.0.2

Qt Creator 18.0.2 Windows x86_64 历史版本安装包,适合需要旧版本 IDE、旧项目兼容、Qt/C++ 项目维护、构建套件配置和调试环境回退的用户使用。

下载

方法二:自动连接(基于命名约定,仅限于同一对象内)

如果 Worker 类里有个槽叫 onTaskFinished(),且信号名是 taskFinished(),那么只要在构造函数中调用 connect(this, &Worker::taskFinished, this, &Worker::onTaskFinished),就能自动响应。但这种方式耦合度高,不推荐用于跨对象通信。

方法三:Lambda 表达式作为临时槽(适合简单逻辑、无需单独声明槽函数)

connect(worker, &Worker::errorOccurred,
    this, [=](const QString &msg) {
      QMessageBox::warning(this, "Error", msg);
    });

自定义槽函数的声明与实现

第一步:在类的 public 或 public slots: 区域声明槽函数(Qt5+ 允许直接写在 public 下)

public slots:
  void onTaskDone();
  void updateProgress(int value);

第二步:在 .cpp 文件中实现这些函数,注意返回值必须是 void

void MainWindow::onTaskDone() {
  ui->startButton->setEnabled(true);
  ui->statusLabel->setText("任务已完成");
}

第三步:确保槽函数签名与信号参数严格匹配(类型、顺序、数量),否则 connect 会失败且无编译错误——运行时信号发出去,槽却收不到。

【connect 返回 bool 值,务必检查是否为 true,false 表示连接失败】

bool ok = connect(worker, &Worker::taskFinished, this, &MainWindow::onTaskDone);
if (!ok) qWarning() << "Signal-slot connection failed!";

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

9425

2023.10.31

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

3442

2025.08.15

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

1321

2025.12.05

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

140

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

60

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

60

2026.09.16

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

40

2026.09.16

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

40

2026.09.16

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

360

2026.09.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Qt入门课堂 - Qt Quick Controls
Qt入门课堂 - Qt Quick Controls

共0课时 | 0人学习

Qt Creator 调试文档
Qt Creator 调试文档

共0课时 | 0人学习

Qt Creator 项目创建文档
Qt Creator 项目创建文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn