简单理解:QT的信号与槽代码

张开发
2026/4/16 21:37:47 15 分钟阅读

分享文章

简单理解:QT的信号与槽代码
// 包含Qt应用程序类头文件 // 作用让程序能创建窗口、运行界面和C语言#includestdio.h一个道理 #include QApplication // 包含按钮控件的头文件 // 作用让程序能创建、使用按钮 #include QPushButton // 包含基础窗口类头文件 // 作用用来创建一个空白窗口放按钮等控件 #include QWidget // 包含打印输出头文件 // 作用在控制台输出文字相当于C语言的printf #include QDebug // 定义一个类名字叫MyClass // : public QObject 表示继承Qt的QObject // 只有继承QObject才能使用信号和槽机制C语言没有这种写法 class MyClass : public QObject { // Qt固定必须写的宏 // 作用开启Qt元对象系统让这个类支持信号、槽、属性 // 不写这行信号槽完全不能用 Q_OBJECT; public: // 下面这一整行是【构造函数】创建MyClass对象时自动执行 // explicitC关键字防止隐式类型转换Qt类固定这么写照抄即可 // MyClass构造函数名必须和类名完全一样 // (QObject *parent nullptr)函数参数 // QObject*参数类型是QObject指针指针就是C语言里的地址 // parent参数名字代表“父对象”Qt用来自动管理内存 // nullptr默认参数如果不传父对象就设为空指针相当于C的NULL // : C语法用来调用父类的构造函数 // QObject(parent)调用父类QObject的构造函数并把parent传进去 explicit MyClass(QObject *parent nullptr) : QObject(parent) { // 构造函数的函数体 // 这里目前不需要做任何事所以空着 } // signalsQt关键字表示下面开始定义“信号” // 信号就是“发出通知”只需要声明不需要写函数实现 signals: // 定义一个信号名字叫mySignal // void没有返回值信号都没有返回值 // (int value)信号携带一个int类型的参数用来传递数字 // 信号只写声明不写大括号Qt自动生成实现 void mySignal(int value); // public slotsQt关键字表示下面开始定义“槽函数” // 槽函数就是“收到信号后要执行的函数” public slots: // 定义槽函数名字叫mySlot // 参数int num要和信号的参数对应这样才能接收信号传过来的数字 void mySlot(int num) { // qDebug() Qt的打印语句 // 作用在控制台输出文字和变量相当于C语言printf qDebug() 槽函数被触发收到的数字是 num; } }; // main函数程序入口所有C/C程序都从这里开始运行 // int返回值类型 // argc命令行参数个数 // argv命令行参数内容和C语言完全一样 int main(int argc, char *argv[]) { // 创建Qt应用程序对象名字叫a // 所有Qt图形界面程序必须先创建这个对象固定写法 QApplication a(argc, argv); // 创建一个窗口对象名字叫w // 这个窗口是程序的主界面 QWidget w; // 调用窗口对象的setWindowTitle函数 // 作用设置窗口标题栏显示的文字 w.setWindowTitle(信号槽完整演示); // 创建一个按钮对象名字叫btn // 点我发送信号按钮上显示的文字 // w父对象是窗口w表示按钮显示在w这个窗口里 // 取地址符号和C语言的作用一样 QPushButton btn(点我发送信号, w); // 调用按钮的move函数 // 作用设置按钮在窗口中的位置距离左上角x100y100 btn.move(100, 100); // 创建自定义类MyClass的对象名字叫obj // 这个对象拥有我们定义的信号mySignal和槽mySlot MyClass obj; // connect函数Qt核心函数作用是【把信号和槽绑定在一起】 // 参数1 btn信号发送者是按钮btn取地址 // 参数2 QPushButton::clicked按钮的clicked点击信号 // :: 叫作用域符号表示“属于谁”即QPushButton类的clicked信号 // 参数3 obj信号接收者是obj对象 // {}C匿名函数按钮点击后执行大括号里的代码 connect(btn, // 发送者按钮对象 QPushButton::clicked, // 信号按钮被点击 obj, // 接收者 { // 点击后要执行的代码 // emitQt关键字意思是“发送信号” // 发送obj的mySignal信号并传递参数666 emit obj.mySignal(666); }); // 第二个connect绑定自定义信号和自定义槽 // 参数1 obj信号发送者是obj // 参数2 MyClass::mySignalobj的mySignal信号 // 参数3 obj信号接收者也是obj // 参数4 MyClass::mySlotobj的mySlot槽函数 connect(obj, // 发送者 MyClass::mySignal, // 自定义信号 obj, // 接收者 MyClass::mySlot); // 槽函数 // 调用窗口的show函数 // 作用让窗口显示出来不调用则窗口看不见 w.show(); // a.exec()启动Qt的消息循环 // 作用让程序一直运行等待用户点击按钮、关闭窗口等操作 // 程序会停在这里直到关闭窗口才会退出 return a.exec(); } // Qt固定必须包含的文件 // 作用让Qt编译器生成信号槽相关代码否则运行时报错 #include main.moc你最看不懂的那一行单独再看一遍explicit MyClass(QObject *parent nullptr) : QObject(parent)逐段注释explicit→ 固定关键字防错误转换照抄MyClass→ 构造函数名必须和类名一样(QObject *parent→ 参数是父对象指针地址 nullptr→ 不传父对象时默认为空:→ C 语法调用父类构造QObject(parent)→ 调用父类 QObject 的构造现在整个流程用大白话走一遍程序运行 → 出现窗口和按钮你点按钮 → 按钮发出clicked信号connect 捕捉到点击 → 执行emit mySignal(666)发出信号 → 另一个 connect 接到自动调用槽函数mySlot控制台打印槽函数被触发收到的数字是666

更多文章