Qt5核心模块详细讲解
个人博客:blogs.wurp.top
一、QtCore模块的核心功能
- 非GUI基础功能
提供事件循环、对象模型、线程管理、文件IO、容器类、文本处理等基础服务。 - 元对象系统(Meta-Object System)
核心特性:信号与槽、运行时类型信息(RTTI)、动态属性系统。 - 跨平台抽象
封装操作系统差异(文件路径、时间、本地化等)。
二、关键组件与类详解
*1. 元对象系统(Meta-Object System)
-
核心类:
QObject
- 所有支持信号槽的类的基类。
- 功能:
- 父子对象内存管理(自动析构子对象)。
- 信号槽通信机制。
- 动态属性(
setProperty()
/property()
)。 - 事件处理(
event()
虚函数)。
- 使用限制:
- 需在类声明中添加
Q_OBJECT
宏(触发MOC代码生成)。 - 不支持多重继承(若需继承多个类,只能有一个
QObject
子类)。
- 需在类声明中添加
-
信号与槽(Signals & Slots)
- 声明方式:
class MyClass : public QObject {Q_OBJECT signals:void dataChanged(QString newData); public slots:void updateData(const QString &data); };
- 连接方式:
QObject::connect(sender, &Sender::signal, receiver, &Receiver::slot);
- 特性:
- 类型安全(编译时检查)。
- 支持异步队列连接(跨线程)。
- 可断开连接(
disconnect()
)。
- 声明方式:
-
元对象编译器(MOC)
- 预处理器:解析
Q_OBJECT
类,生成moc_*.cpp
文件(含元对象代码)。 - 作用:实现信号槽调用、动态属性、反射。
- 预处理器:解析
2. 容器类(Containers)
Qt提供STL风格的容器,支持隐式共享(写时复制),降低内存开销。
容器 | 用途 | 特点 |
---|---|---|
QList<T> | 通用动态数组 | 快速首尾插入 |
QVector<T> | 连续内存数组(类似std::vector ) | Qt5中与QList 合并 |
QMap<Key, T> | 有序字典(红黑树) | Key需支持operator< |
QHash<Key, T> | 哈希表 | 更快的查找(O(1)) |
QSet<T> | 无序集合 | 基于QHash 实现 |
示例:
QMap<QString, int> map;
map["apple"] = 5;
map.insert("banana", 3);// 范围循环(C++11风格)
for (auto &key : map.keys()) {qDebug() << key << ":" << map.value(key);
}
3. 文件与IO(File & I/O)
-
QFile
文件读写:QFile file("data.txt"); if (file.open(QIODevice::ReadOnly)) {QByteArray data = file.readAll();file.close(); }
-
QTextStream
/QDataStream
格式化文本/二进制数据读写:QFile file("output.txt"); QTextStream out(&file); out << "Qt version: " << qVersion();
-
QDir
目录操作:QDir dir("/path/to/dir"); dir.mkdir("new_folder");
-
QTemporaryFile
自动删除的临时文件。
4. 事件处理(Event System)
- 核心机制
- 事件队列(Event Loop)由
QCoreApplication
管理。 - 事件对象:
QEvent
子类(如QKeyEvent
,QMouseEvent
)。
- 事件队列(Event Loop)由
- 处理方式:
- 重写
QObject::event(QEvent *)
。 - 特定事件处理器(如
keyPressEvent()
)。
- 重写
- 自定义事件:
class CustomEvent : public QEvent { public:static const QEvent::Type TYPE = static_cast<QEvent::Type>(1000);CustomEvent() : QEvent(TYPE) {} };// 发送事件 QCoreApplication::postEvent(receiver, new CustomEvent());
5. 线程与并发(Threading & Concurrency)
-
QThread
线程管理:class Worker : public QObject {Q_OBJECT public slots:void doWork() { /* 耗时操作 */ } };QThread thread; Worker worker; worker.moveToThread(&thread); thread.start(); QMetaObject::invokeMethod(&worker, "doWork");
-
同步原语
QMutex
:互斥锁。QReadWriteLock
:读写锁。QSemaphore
:信号量。QWaitCondition
:条件变量。
-
线程安全容器
QConcurrent
命名空间提供并行算法:QList<int> list = {1, 2, 3, 4}; QFuture<void> future = QtConcurrent::map(list, [](int &x) { x *= 2; }); future.waitForFinished(); // 结果: [2, 4, 6, 8]
6. 时间与日期(Time & Date)
-
QDateTime
日期时间操作:QDateTime now = QDateTime::currentDateTime(); qDebug() << "Now:" << now.toString("yyyy-MM-dd hh:mm:ss");
-
QTimer
定时器(单次或周期):QTimer *timer = new QTimer; connect(timer, &QTimer::timeout, []() { qDebug() << "Timeout!"; }); timer->start(1000); // 每秒触发
7. 文本处理(Text Handling)
-
QString
Unicode字符串(UTF-16):QString s = "Hello, 世界!"; s.replace("Hello", "你好").append(" 👋");
-
QRegularExpression
(Qt5推荐)
正则表达式:QRegularExpression re("\\d+"); auto match = re.match("abc123"); if (match.hasMatch()) qDebug() << "Found number:" << match.captured(0); // "123"
8. 数据序列化(Serialization)
-
QVariant
通用类型容器(支持Qt内置类型和Q_GADGET
自定义类型):QVariant v1 = 42; // int QVariant v2 = "Qt"; // QString
-
QDataStream
二进制序列化(跨平台):QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); stream << QString("text") << QPoint(10, 20);
9. 系统信息与工具
QCoreApplication
应用核心:管理事件循环、命令行参数。QSettings
跨平台配置存储(注册表/INI文件):QSettings settings("MyCompany", "MyApp"); settings.setValue("theme", "dark"); QString theme = settings.value("theme").toString();
QFileInfo
文件元数据(路径、大小、权限)。
三、实际应用场景
- 后台服务
使用QCoreApplication
+ 事件循环 +QThreadPool
构建无GUI服务。 - 跨平台工具
利用QFile
、QDir
、QProcess
抽象OS差异。 - 数据处理流水线
结合信号槽和QtConcurrent
实现异步任务链。 - 插件架构
通过QPluginLoader
动态加载扩展。
四、重要注意事项
- 内存管理:
QObject
子类自动管理子对象(parent
机制),避免手动delete
。 - 线程安全:信号槽跨线程使用需指定连接类型(
Qt::QueuedConnection
)。 - MOC要求:信号槽类必须运行
qmake
/cmake
触发MOC预处理。
提示:使用QtCreator时,MOC自动集成;手动构建需确保生成
moc_*.cpp
文件。