Qt编程(3): 信号和槽函数
一、信号和槽核心概念大白话信号和槽是Qt特有的通信机制用来实现对象之间的交互简单理解就是一个对象发出信号另一个对象的槽函数接收并执行动作全程不用手动调用函数触发信号就自动运行槽函数非常适合界面交互、事件响应这类场景。比如你之前写的按钮点击弹窗就是按钮发出“被点击”的信号主窗口的槽函数接收到信号后弹出对话框完全靠信号槽绑定实现自动触发。核心前提使用信号槽的类必须继承QObject并且类内第一行加Q_OBJECT宏否则信号槽无法生效Qt Widgets项目里的主窗口、QDialog、QPushButton都满足这个条件。二、实用举例按钮点击弹出对话框Qt6 完整可运行这个例子完全贴合你之前的代码场景适配当前主流的Qt6版本同时保留你用过的 Qt4 旧版语法Qt6 依然兼容重点推荐 Qt5/Qt6 通用的新版函数指针语法代码可直接复制运行适配 Qt Widgets 常规项目。这个例子完全贴合你之前的代码场景用按钮点击触发槽函数分别演示Qt4旧版语法你之前用的和Qt5新版语法更推荐代码适配Qt Widgets常规项目直接复制就能用。场景说明主窗口放一个按钮按钮文字设为“弹出子对话框”点击按钮后触发槽函数弹出一个简单的模态对话框全程用信号槽实现交互。1. 头文件mainwindow.h头文件主要完成类定义、信号槽声明必须加Q_OBJECT宏槽函数用private slots声明旧版要求严格新版可放宽。#ifndefMAINWINDOW_H#defineMAINWINDOW_H#includeQMainWindow#includeQPushButton#includeQDialogQT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}QT_END_NAMESPACEclassMainWindow:publicQMainWindow{// 核心必须加这个宏信号槽才能生效Q_OBJECTpublic:MainWindow(QWidget*parentnullptr);~MainWindow();// 槽函数声明区旧版语法必须写在slots关键字下privateslots:// 自定义槽函数点击按钮后执行弹出对话框voidshowChildDialog();private:Ui::MainWindow*ui;// 定义按钮对象也可以用UI设计师拖拽生成对应你之前的ui-showChildButtonQPushButton*showBtn;};#endif// MAINWINDOW_H2. 源文件mainwindow.cpp源文件完成按钮创建、信号槽绑定、槽函数实现Qt6 中旧版宏语法可正常运行但强烈推荐新版函数指针写法编译期检查错误、无运行时失效风险和你之前的代码完美衔接。#includemainwindow.h#includeui_mainwindow.h#includeQVBoxLayout#includeQLabelMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);// 设置窗口标题和大小Qt6 语法无变化this-setWindowTitle(Qt6 信号槽示例);this-resize(400,300);// 创建按钮设置文字showBtnnewQPushButton(弹出子对话框,this);// 把按钮放到窗口中央QVBoxLayout*layoutnewQVBoxLayout;layout-addWidget(showBtn);QWidget*centerWidgetnewQWidget(this);centerWidget-setLayout(layout);this-setCentralWidget(centerWidget);// Qt6 两种信号槽绑定写法均兼容 // 写法1你之前用的 Qt4 旧版宏语法Qt6 兼容不推荐新项目使用// 缺点运行时才检查错误拼写错误不报错Qt6 官方已不建议新项目使用// connect(showBtn, SIGNAL(clicked(bool)), this, SLOT(showChildDialog()));// 写法2Qt5/Qt6 通用新版语法函数指针Qt6 首选编译期强校验// 格式connect(发送者, 发送者类::信号名, 接收者, 接收者类::槽函数名);connect(showBtn,QPushButton::clicked,this,MainWindow::showChildDialog);}MainWindow::~MainWindow(){deleteui;}// 槽函数具体实现点击按钮后执行的逻辑voidMainWindow::showChildDialog(){// 弹出模态对话框Qt6 用法不变QDialogchildDlg(this);childDlg.setWindowTitle(子对话框);childDlg.resize(300,200);// 对话框加提示文字QLabel*tipnewQLabel(这是 Qt6 信号槽触发的弹窗,childDlg);QVBoxLayout*dlgLaynewQVBoxLayout(childDlg);dlgLay-addWidget(tip);// 阻塞显示对话框关闭前无法操作主窗口childDlg.exec();}3. 主函数main.cpp标准Qt主函数无需修改直接运行即可。#includemainwindow.h#includeQApplicationintmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindow w;w.show();returna.exec();}三、代码逐部分拆解对应你的旧版connect你之前的代码connect(ui-showChildButton, SIGNAL(clicked(bool)), this, SLOT(showChildDialog()));connectQt信号槽绑定函数负责把信号和槽关联起来ui-showChildButton信号发送者就是UI里的按钮负责发出点击信号SIGNAL(clicked(bool))信号按钮自带的clicked点击信号bool参数表示按钮是否按下SIGNAL是Qt4宏用来包裹信号this信号接收者当前主窗口槽函数属于主窗口SLOT(showChildDialog())槽函数自己定义的函数信号触发后自动执行这个函数SLOT是Qt4宏用来包裹槽函数四、Qt6 关键注意事项核心必看参数匹配规则信号的参数可以比槽函数多反之不行比如 clicked 带 bool 参数槽函数无参数Qt6 下依然合法如果槽函数有参数信号必须有对应类型参数。Qt6 语法选择重点旧版 SIGNAL/SLOT 宏语法 Qt6 只是兼容不推荐新项目使用新版函数指针写法是 Qt6 官方首选编译期检查错误彻底避免运行时连接失效新手优先学这个。自定义信号槽Qt6 中自定义信号槽规则不变依然需要继承 QObject Q_OBJECT 宏信号只需声明无需实现槽函数正常编写即可。Qt6 其他小变化部分旧版弃用接口已移除但信号槽核心机制、常用控件信号如 QPushButton::clicked完全没变之前学的逻辑直接通用。适用场景界面交互、线程通信、组件间传值等场景Qt6 依旧靠信号槽实现是 Qt 核心交互机制和旧版本用法一致。参数匹配规则信号的参数可以比槽函数多反之不行比如clicked带bool参数槽函数无参数是合法的如果槽函数有参数信号必须有对应参数旧版vs新版旧版语法运行时才会检查错误拼写错了不报错新版编译期就检查更不容易出错优先用新版自定义信号槽除了Qt自带的信号按钮点击、窗口关闭也可以自己定义信号和槽实现自定义对象通信适用场景界面交互、线程通信、组件间传值等场景都能用是Qt最核心的交互机制

相关新闻

MuSGD优化器原理说明(通俗+技术版)

MuSGD优化器原理说明(通俗+技术版)

MuSGD优化器原理说明(通俗技术版)1. 引言在深度学习模型训练过程中,需要通过优化算法不断调整模型参数,使模型预测结果与真实结果之间的误差(loss)逐渐减小。常见的优化算法包括 SGD、Adam、RMSProp 等。YO…

2026/7/6 6:12:43 阅读更多 →
基于Matlab的欧拉法、改进欧拉法、显示欧拉法、隐式欧拉法及四阶龙格库塔法求解微分方程

基于Matlab的欧拉法、改进欧拉法、显示欧拉法、隐式欧拉法及四阶龙格库塔法求解微分方程

基于matlab的欧拉法,改进欧拉法,显示欧拉法,隐式你欧拉法,四阶龙格库塔法求解微分方程微分方程这玩意儿,碰到手算真是要命。但有了MATLAB,咱们就能用数值方法暴力破解各种难解的方程。今天主要聊聊几个经典…

2026/5/17 10:24:30 阅读更多 →
【Spring Boot】统一数据返回

【Spring Boot】统一数据返回

目录 统一数据返回 一. 概念二.实现统一数据返回 2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维&#xff0c…

2026/7/5 0:55:20 阅读更多 →

最新新闻

华为云 ECS 上部署 Prometheus + Grafana 监控体系

华为云 ECS 上部署 Prometheus + Grafana 监控体系

ECS 规格: **ECS-Monitor** | 2vCPU / 4GiB(s6.medium.2) | Ubuntu 22.04 | 40GiB SSD | 1 | 跑 Prometheus Grafana Alertmanager | | **ECS-Target** | 2vCPU / 2GiB(s6.small.2) | Ubuntu 22.04 | 40GiB SSD | …

2026/7/6 6:10:48 阅读更多 →
如何用Zotero-Better-Notes实现笔记双向同步:告别手动复制粘贴的终极指南

如何用Zotero-Better-Notes实现笔记双向同步:告别手动复制粘贴的终极指南

如何用Zotero-Better-Notes实现笔记双向同步:告别手动复制粘贴的终极指南 【免费下载链接】zotero-better-notes Everything about note management. All in Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-notes 还在为Zotero和Obsidi…

2026/7/6 6:08:46 阅读更多 →
短剧出海中小企业主流广告素材监测工具(2026 最新,预算友好型)

短剧出海中小企业主流广告素材监测工具(2026 最新,预算友好型)

按中小团队适配度、短剧垂直能力、价格、国内访问稳定性分为 4 大类:短剧专精平价工具、通用高性价比工具、大厂专业工具(预算充足再选)、官方免费工具(基础备用)。一、短剧垂直专精(中小短剧团队首选&…

2026/7/6 6:06:46 阅读更多 →
Adobe软件激活新选择:5分钟掌握通用破解工具

Adobe软件激活新选择:5分钟掌握通用破解工具

Adobe软件激活新选择:5分钟掌握通用破解工具 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高昂订阅费而犹豫吗&#xff…

2026/7/6 6:06:46 阅读更多 →
智能网盘直链解析:重新定义文件下载体验

智能网盘直链解析:重新定义文件下载体验

智能网盘直链解析:重新定义文件下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云…

2026/7/6 6:02:46 阅读更多 →
终极网盘下载加速方案:LinkSwift直链解析工具完整指南

终极网盘下载加速方案:LinkSwift直链解析工具完整指南

终极网盘下载加速方案:LinkSwift直链解析工具完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

2026/7/6 6:02:46 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻