一、信号和槽核心概念大白话信号和槽是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最核心的交互机制