)
一句话Qt 类本质就是 C 的类只是 Qt 框架扩展了一套【QObject 对象模型】。 普通 C 类只封装变量、成员函数继承 QObject 的 Qt 类除了普通 C 能力额外拥有【信号槽、对象树自动内存管理、元对象系统】三大核心能力Qt一、最核心根类QObject重中之重QObject Qt 世界所有对象的祖宗基类几乎所有控件、窗口、定时器、线程类都是它的子类直接继承 / 间接继承。注意区分两个概念继承关系父类 / 子类C 的类继承QWidget 继承 QObject对象树父子 (parent)对象实例之间的归属用来自动管理内存不是 C 继承✅ QObject 带来 3 个核心功能信号与槽对象通信对象之间不用硬调用函数通过信号槽收发消息按钮点击就是典型信号对象树自动内存管理parent 机制new 对象时传入this作为父对象父对象销毁自动删除全部子对象不用手动 delete减少内存泄漏元对象系统moc 工具运行时知道类名字、函数实现 Q_OBJECT 宏的能力⚠️ 例外QString、QList、QColor这类值类型类不继承 QObject和普通 C 的 string、vector 用法接近不能写 Q_OBJECT、不能用信号槽。二、可视化窗口核心类QWidget所有界面控件的基类QWidget继承自QObject QPaintDevice绘图设备只要能在屏幕上显示出来的东西全部是 QWidget 子类QMainWindow主窗口带菜单栏、状态栏Qt 新建项目默认的窗口类QDialog弹窗对话框提示框、文件选择框QPushButton按钮QLabel文本 / 图片标签QLineEdit单行输入框简单理解QObject 负责逻辑通信、内存管理QWidget 额外增加界面绘制、鼠标键盘事件。三、写一个自己的 Qt 类完整示例逐行解释新建头文件myclass.h#ifndef MYCLASS_H #define MYCLASS_H #include QObject // 自定义Qt类继承QObject class MyClass : public QObject { // 开启元对象系统必须写才能用信号槽 Q_OBJECT public: // 构造函数explicit防止隐式转换parent父对象默认nullptr explicit MyClass(QObject *parent nullptr); // 普通成员函数用来发射信号 void testSend(); // 信号对外发出通知只声明不写函数体 signals: void msgSignal(QString text); // 槽函数接收信号执行业务 public: void recvSlot(QString text); }; #endif // MYCLASS_Hcpp 文件myclass.cpp#include myclass.h #include QDebug // 构造函数初始化列表调用父类QObject构造传入parent MyClass::MyClass(QObject *parent) : QObject(parent) { } void MyClass::testSend() { // emit发射信号 emit msgSignal(Hello Qt类); } // 槽函数实现收到信号后打印 void MyClass::recvSlot(QString text) { qDebug() 槽收到消息 text; }main.cpp#include QCoreApplication #include myclass.h int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyClass obj1; // 信号发送对象 MyClass obj2; // 接收对象 // connect连接信号槽 connect(obj1, MyClass::msgSignal, obj2, MyClass::recvSlot); obj1.testSend(); // 调用函数触发emit发射信号 return a.exec(); }运行输出槽收到消息Hello Qt类四、对象树parent 机制新手最容易混淆// 创建按钮父对象是当前窗口this QPushButton *btn new QPushButton(测试按钮, this);图解逻辑btn 的 parent this当前窗口对象窗口对象会把 btn 加入自己的 children 子对象列表关闭窗口窗口对象销毁自动把 btn delete不用手动释放内存❗重点parent 是对象实例之间的归属关系不是类的继承 类比 类的继承人 → 学生模板的继承 对象树 parent家长 → 孩子实例的归属家长消失孩子跟着销毁五、Qt 类 和 普通 C 类对比表对比项普通 C 类继承 QObject 的 Qt 类继承默认无父类必须继承 QObject/QWidget 等Q_OBJECT不能写需要写开启元对象系统信号槽不支持支持emitconnect内存管理new 之后必须手动 delete设置 parent父对象自动回收子对象拷贝赋值支持❌禁止拷贝不能objAobjB运行时识别RTTI 才可以自带元对象直接获取类名六、新手高频踩坑写 Q_OBJECT忘记执行 qmake编译报undefined reference to vtable虚表错误 解决菜单栏【构建】→【Run qmake】再重新构建项目QObject 子类不能拷贝不能写MyClass a b;只能用指针UI 控件QPushButton、QLabel属于 QWidget只能在主线程操作子线程不能直接修改界面QString/QList这些值类型不是 QObject 子类不能写 Q_OBJECT没有 parent用法和 std::string 类似