Qt 是一套跨平台的 C++ 应用程序开发框架,涵盖 GUI 开发、网络编程、数据库操作、多媒体处理等多个领域,兼具易用性和高性能。以下是 Qt 核心知识点的系统梳理,从基础到进阶层层递进:
一、Qt 基础核心
1. Qt 概述与环境搭建
- 核心特性:跨平台(Windows/macOS/Linux/ 嵌入式等)、信号与槽机制、元对象系统、丰富的控件库、模块化设计。
- 版本区别:Qt 5(长期支持版,稳定成熟)、Qt 6(性能优化、模块化重构,推荐新项目)。
- 开发环境:Qt Creator(官方 IDE,集成编辑、编译、调试)、MinGW(Windows 下 GCC 编译器)、MSVC(Visual Studio 编译器)、CMake/QMake(构建工具)。
- 环境配置 :Qt 安装时选择对应编译器、组件(如 Qt Widgets、Qt Quick、网络模块等),环境变量配置(
QT_PATH、PATH包含 Qt 库路径)。
2. Qt 核心机制
(1)信号与槽(Signal & Slot)
-
作用:Qt 特有的对象间通信机制,替代传统回调函数,支持类型安全、松散耦合。
-
核心概念 :
- 信号(Signal):对象状态变化时发出的通知(如按钮
clicked()、文本框textChanged()),无需实现。 - 槽(Slot):接收信号并处理的函数(需在类中声明,可像普通函数调用)。
- 连接(Connect):通过
QObject::connect()关联信号与槽,支持多对多、信号连信号。
- 信号(Signal):对象状态变化时发出的通知(如按钮
-
连接方式 :
cpp
// Qt 5 语法(推荐,类型安全) connect(sender, &Sender::signal, receiver, &Receiver::slot); // Qt 4 语法(需包含头文件,依赖 MOC,不推荐) connect(sender, SIGNAL(signal()), receiver, SLOT(slot())); -
连接类型(Qt::ConnectionType) :
Qt::AutoConnection(默认):根据线程自动选择同步 / 异步。Qt::DirectConnection:同步调用(信号发送者线程执行槽函数)。Qt::QueuedConnection:异步调用(接收者线程事件循环执行槽函数,跨线程必用)。
-
注意事项 :信号与槽的参数需匹配(槽参数可少于信号,且类型兼容);发送者 / 接收者销毁时自动断开连接;槽函数需在类中用
slots关键字声明(Qt 5 后可省略,但推荐保留可读性)。
(2)元对象系统(Meta-Object System)
- 核心组件 :
QObject(所有支持元对象特性的类的基类)、QMetaObject(元对象信息)、MOC(元对象编译器,预处理.h文件生成元对象代码)。 - 关键宏 :
Q_OBJECT:必须在类声明开头,启用元对象特性(信号、槽、动态属性等)。Q_DECLARE_METATYPE(Type):注册自定义类型,支持信号槽传递、QVariant存储。
- 核心功能 :动态类型识别(
qobject_cast)、反射(获取类名、属性、信号槽信息)、动态属性(setProperty()/property())。
(3)QObject 与对象模型
- QObject 特性:支持父子对象机制(父对象销毁时自动销毁子对象,避免内存泄漏)、事件处理、信号槽、动态属性。
- 父子关系 :
- 通过构造函数传入父对象:
QPushButton *btn = new QPushButton(this);(this为父对象)。 - 手动设置父子关系:
btn->setParent(this);。 - 父对象管理子对象:
children()获取子对象列表,findChild<T>()查找子对象。
- 通过构造函数传入父对象:
- 内存管理 :QObject 派生类建议使用 "父子树" 管理,无需手动
delete;非 QObject 派生类需手动管理或使用智能指针(QSharedPointer)。
3. Qt 基本数据类型
-
核心类型 :
- 字符串:
QString(Unicode 编码,支持中文,比std::string更易用,提供toStdString()/fromStdString()转换)。 - 容器:
QList(动态数组,推荐优先使用)、QVector(连续内存数组)、QMap(键值对,有序)、QHash(哈希表,无序,查询更快)、QSet(集合)。 - 变体类型:
QVariant(可存储任意 Qt 支持的类型,包括自定义类型,用于信号槽参数、配置存储等)。 - 其他:
QPoint(点)、QSize(尺寸)、QRect(矩形)、QColor(颜色)、QFont(字体)、QDateTime(日期时间)。
- 字符串:
-
容器使用示例 :
cpp
QList<QString> list; list << "A" << "B" << "C"; for (const QString &str : list) { /* 遍历 */ } QMap<int, QString> map; map.insert(1, "One"); QString val = map.value(1); // 取值
二、Qt GUI 开发(Qt Widgets)
Qt Widgets 是基于桌面端的传统 GUI 框架,提供丰富的原生控件,适合开发桌面应用。
1. 窗口与控件
- 核心窗口类 :
QWidget:所有控件的基类,可作为独立窗口(设置setWindowFlags(Qt::Window))。QMainWindow:主窗口框架,包含菜单栏、工具栏、状态栏、中央部件、dock 部件。QDialog:对话框窗口(模态 / 非模态),如QMessageBox(消息框)、QFileDialog(文件选择框)。
- 常用控件 :
- 按钮类:
QPushButton(普通按钮)、QRadioButton(单选按钮)、QCheckBox(复选框)。 - 输入类:
QLineEdit(单行文本输入)、QTextEdit(多行文本编辑)、QSpinBox(数值调节框)、QComboBox(下拉框)。 - 显示类:
QLabel(文本 / 图片显示)、QTableWidget(表格)、QTreeWidget(树形控件)、QListWidget(列表控件)。 - 容器类:
QWidget(基础容器)、QGroupBox(分组框)、QTabWidget(标签页)、QScrollArea(滚动区域)。
- 按钮类:
2. 布局管理
布局管理用于自动调整控件位置和大小,适配窗口缩放,避免硬编码坐标。
- 核心布局类 :
QVBoxLayout:垂直布局(控件上下排列)。QHBoxLayout:水平布局(控件左右排列)。QGridLayout:网格布局(控件按行列排列)。QFormLayout:表单布局(标签 + 输入控件成对排列)。
- 布局使用步骤 :
- 创建布局对象(如
QVBoxLayout *layout = new QVBoxLayout;)。 - 向布局添加控件(
layout->addWidget(btn);)。 - 设置窗口 / 容器的布局(
widget->setLayout(layout);)。
- 创建布局对象(如
- 布局常用方法 :
addSpacing(int):添加固定间距。addStretch(int):添加拉伸因子(控制控件拉伸比例)。setContentsMargins(int left, int top, int right, int bottom):设置布局边距。setSpacing(int):设置控件间距。
3. 样式与美化
-
QSS(Qt Style Sheet) :类似 CSS 的样式表,用于美化控件,支持全局 / 局部样式。
-
语法:
控件类型[属性=值] { 样式属性: 值; }。 -
示例: cpp
// 全局样式(应用于整个应用) qApp->setStyleSheet(R"( QPushButton { background-color: #2196F3; color: white; border: none; padding: 8px 16px; border-radius: 4px; } QPushButton:hover { background-color: #1976D2; } )"); // 局部样式(应用于单个控件) btn->setStyleSheet("color: red; font-size: 14px;");
-
-
内置样式 :通过
QApplication::setStyle()设置,如Fusion(跨平台)、Windows(Windows 原生)、Macintosh(macOS 原生)。 -
自定义控件 :继承
QWidget,重写paintEvent(QPaintEvent *)用QPainter绘制自定义界面。
4. 事件处理
Qt 事件模型基于 "事件分发",控件通过重写事件处理函数响应事件(如点击、键盘输入、窗口缩放)。
- 核心事件类 :
QEvent(所有事件的基类),派生类如QMouseEvent(鼠标事件)、QKeyEvent(键盘事件)、QPaintEvent(绘制事件)、QResizeEvent(窗口大小变化事件)。 - 事件处理方式 :
-
重写控件的事件处理函数(最常用): cpp
void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { qDebug() << "左键点击:" << event->pos(); // pos() 相对控件坐标,globalPos() 屏幕坐标 } QWidget::mousePressEvent(event); // 传递事件给父类,保证默认行为 } -
安装事件过滤器(拦截其他控件的事件): cpp
// 给 btn 安装事件过滤器(this 为过滤器对象) btn->installEventFilter(this); // 重写 eventFilter 函数 bool MyWidget::eventFilter(QObject *watched, QEvent *event) { if (watched == btn && event->type() == QEvent::MousePress) { qDebug() << "拦截按钮点击事件"; return true; // 返回 true 表示事件已处理,不再传递 } return QWidget::eventFilter(watched, event); // 其他事件传递 } -
重写
event(QEvent *)函数(事件分发前的统一处理)。
-
- 常用事件 :
- 鼠标事件:
mousePressEvent(按下)、mouseReleaseEvent(释放)、mouseMoveEvent(移动)。 - 键盘事件:
keyPressEvent(按键按下)、keyReleaseEvent(按键释放)。 - 绘制事件:
paintEvent(控件需要重绘时触发,必须通过QPainter绘制)。
- 鼠标事件:
5. 对话框
- 模态对话框 :阻塞父窗口操作,直到对话框关闭(如
QMessageBox::information(this, "标题", "内容");)。- 创建方式:
dialog.exec();。
- 创建方式:
- 非模态对话框 :不阻塞父窗口,可同时操作(如浮动工具窗口)。
- 创建方式:
dialog.show();,需注意设置父对象或手动管理内存。
- 创建方式:
- 自定义对话框 :继承
QDialog,添加控件和布局,通过exec()显示,用accept()/reject()关闭并返回结果。 - 标准对话框 :
- 消息框:
QMessageBox(信息、警告、错误、询问)。 - 文件选择框:
QFileDialog::getOpenFileName()(打开文件)、QFileDialog::getSaveFileName()(保存文件)。 - 颜色选择框:
QColorDialog::getColor()。 - 字体选择框:
QFontDialog::getFont()。
- 消息框:
三、Qt 高级特性
1. 多线程编程
Qt 提供两种多线程方案,推荐使用 QThread + 信号槽(松散耦合)。
(1)QThread 用法(推荐)
-
步骤:
- 创建任务类(继承
QObject),在类中定义耗时操作的槽函数。 - 创建
QThread对象,将任务类移到线程中(moveToThread(thread))。 - 连接信号槽(如主线程触发任务、任务完成通知主线程)。
- 启动线程(
thread->start()),线程会执行槽函数中的耗时操作。
- 创建任务类(继承
-
示例: cpp
// 任务类 class Worker : public QObject { Q_OBJECT public slots: void doWork() { // 耗时操作(如文件读取、网络请求) for (int i = 0; i < 100; ++i) { QThread::msleep(100); // 模拟耗时 emit progress(i); // 发送进度信号 } emit finished(); // 任务完成信号 } signals: void progress(int value); void finished(); }; // 主线程中使用 Worker *worker = new Worker; QThread *thread = new QThread; worker->moveToThread(thread); // 连接信号槽 connect(this, &MainWindow::startWork, worker, &Worker::doWork); connect(worker, &Worker::progress, this, &MainWindow::updateProgress); connect(worker, &Worker::finished, thread, &QThread::quit); // 任务完成后退出线程 connect(thread, &QThread::finished, worker, &QObject::deleteLater); // 线程结束后销毁任务对象 connect(thread, &QThread::finished, thread, &QObject::deleteLater); // 销毁线程 thread->start(); // 启动线程 emit startWork(); // 触发任务执行 -
注意事项:
- 任务类不能有父对象(否则
moveToThread失效)。 - 耗时操作必须放在槽函数中,且槽函数不能直接操作 UI(UI 操作必须在主线程,可通过信号槽通知主线程更新)。
- 线程结束时需调用
quit()+wait(),避免内存泄漏。
- 任务类不能有父对象(否则
(2)继承 QThread(不推荐)
- 重写
run()函数,在run()中执行耗时操作。 - 缺点:
run()函数是线程入口,若在其中创建 QObject 且未指定父对象,容易导致线程安全问题;耦合度高。
(3)线程安全
-
禁止跨线程直接操作 UI 控件(Qt UI 控件非线程安全)。
-
跨线程通信优先使用信号槽(
QueuedConnection自动处理线程切换)。 -
共享数据需加锁(
QMutex、QMutexLocker):cpp
QMutex mutex; void func() { QMutexLocker locker(&mutex); // 自动加锁,作用域结束解锁 // 操作共享数据 }
2. 网络编程
Qt 网络模块(Qt Network)支持 TCP/UDP、HTTP、WebSocket 等协议,跨平台且易用。
(1)TCP 编程
-
服务器端(
QTcpServer):cpp
QTcpServer *server = new QTcpServer(this); connect(server, &QTcpServer::newConnection, this, []() { QTcpSocket *clientSocket = server->nextPendingConnection(); // 接收客户端连接 // 连接客户端信号(读取数据、断开连接) connect(clientSocket, &QTcpSocket::readyRead, this, [=]() { QByteArray data = clientSocket->readAll(); // 读取客户端数据 qDebug() << "收到数据:" << data; clientSocket->write("已收到"); // 回复客户端 }); connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater); }); server->listen(QHostAddress::Any, 8888); // 监听所有地址的 8888 端口 -
客户端(
QTcpSocket):cpp
QTcpSocket *socket = new QTcpSocket(this); socket->connectToHost("127.0.0.1", 8888); // 连接服务器 connect(socket, &QTcpSocket::connected, this, [=]() { socket->write("Hello Server"); // 发送数据 }); connect(socket, &QTcpSocket::readyRead, this, [=]() { QByteArray data = socket->readAll(); // 读取服务器回复 });
(2)HTTP 编程(Qt 5.15+ 推荐 QNetworkAccessManager)
-
发送 GET/POST 请求: cpp
QNetworkAccessManager *manager = new QNetworkAccessManager(this); // GET 请求 QNetworkRequest request(QUrl("https://api.example.com/data")); QNetworkReply *reply = manager->get(request); // 处理响应 connect(reply, &QNetworkReply::finished, this, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 解析数据(如 JSON) } else { qDebug() << "请求失败:" << reply->errorString(); } reply->deleteLater(); // 释放资源 }); // POST 请求(发送 JSON 数据) QJsonObject json; json["key"] = "value"; QByteArray postData = QJsonDocument(json).toJson(); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); reply = manager->post(request, postData);
(3)UDP 编程(QUdpSocket)
- 发送数据:
socket->writeDatagram(data, QHostAddress("127.0.0.1"), 8888); - 接收数据:连接
readyRead信号,调用readDatagram()读取。
3. 数据库编程(Qt SQL)
Qt SQL 模块支持多种数据库(MySQL、SQLite、PostgreSQL、SQL Server 等),统一接口操作。
-
核心类 :
QSqlDatabase:数据库连接对象(配置数据库类型、主机、用户名、密码、数据库名)。QSqlQuery:执行 SQL 语句(查询、插入、更新、删除)。QSqlTableModel:表格模型(简化数据库表操作,无需手动写 SQL)。
-
使用步骤 :
- 加载数据库驱动(Qt 自带 SQLite 驱动,其他数据库需手动配置驱动文件)。
- 创建数据库连接。
- 执行 SQL 语句或使用模型操作。
-
示例(SQLite) :
cpp
// 1. 加载驱动并创建连接 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("test.db"); // SQLite 数据库文件路径 if (!db.open()) { qDebug() << "数据库打开失败:" << db.lastError().text(); return; } // 2. 执行 SQL 创建表 QSqlQuery query; QString createSql = "CREATE TABLE IF NOT EXISTS user (" "id INTEGER PRIMARY KEY AUTOINCREMENT," "name TEXT," "age INTEGER)"; if (!query.exec(createSql)) { qDebug() << "创建表失败:" << query.lastError().text(); } // 3. 插入数据 query.prepare("INSERT INTO user (name, age) VALUES (?, ?)"); // 预处理(防止 SQL 注入) query.addBindValue("张三"); query.addBindValue(20); query.exec(); // 4. 查询数据 query.exec("SELECT * FROM user"); while (query.next()) { int id = query.value("id").toInt(); QString name = query.value("name").toString(); int age = query.value("age").toInt(); qDebug() << id << name << age; } // 5. 关闭数据库 db.close();
4. 序列化与配置文件
(1)INI 配置文件(QSettings)
-
用于存储简单的键值对配置(如窗口大小、用户偏好)。
-
示例: cpp
// 写入配置 QSettings settings("MyApp", "Config"); // 组织名 + 应用名(Windows 下存储在注册表,Linux 下存储在 ~/.config) settings.setValue("window/size", QSize(800, 600)); settings.setValue("user/name", "张三"); // 读取配置 QSize windowSize = settings.value("window/size", QSize(1024, 768)).toSize(); // 第二个参数为默认值 QString userName = settings.value("user/name").toString();
(2)JSON 序列化(QJsonDocument、QJsonObject、QJsonArray)
-
用于复杂数据的序列化(如网络传输、文件存储)。
-
示例: cpp
// 构建 JSON 对象 QJsonObject json; json["name"] = "Qt"; json["version"] = 6.5; QJsonArray features; features << "跨平台" << "信号槽" << "GUI"; json["features"] = features; // 转换为 JSON 字符串并写入文件 QJsonDocument doc(json); QFile file("config.json"); if (file.open(QIODevice::WriteOnly)) { file.write(doc.toJson(QJsonDocument::Indented)); // Indented 格式化输出 file.close(); } // 从文件读取并解析 JSON if (file.open(QIODevice::ReadOnly)) { QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); QJsonObject json = doc.object(); QString name = json["name"].toString(); QJsonArray features = json["features"].toArray(); file.close(); }
5. 多媒体处理(Qt Multimedia)
支持音频播放、视频播放、摄像头采集、录音等功能。
-
核心类 :
QMediaPlayer:音频 / 视频播放器(支持本地文件、网络流)。QMediaPlaylist:播放列表。QVideoWidget:视频显示控件。
-
示例(播放音频) :
cpp
QMediaPlayer *player = new QMediaPlayer(this); player->setMedia(QUrl::fromLocalFile("music.mp3")); // 设置音频文件 player->setVolume(50); // 设置音量 player->play(); // 播放 // 控制播放状态 connect(playBtn, &QPushButton::clicked, [=]() { if (player->state() == QMediaPlayer::PlayingState) { player->pause(); } else { player->play(); } });
四、Qt 现代 GUI(Qt Quick/QML)
Qt Quick 是基于 QML(Qt Modeling Language)的现代 GUI 框架,适合开发流畅、动态的界面(如移动应用、嵌入式设备界面),与 C++ 可混合编程。
1. QML 基础
-
QML 特性:声明式语法、支持动画和过渡、内置组件库、与 C++ 交互便捷。
-
核心组件 :
- 基础组件:
Item(所有组件的基类)、Rectangle(矩形)、Text(文本)、Image(图片)、Button(按钮)。 - 布局组件:
Row(水平布局)、Column(垂直布局)、Grid(网格布局)、AnchorLayout(锚点布局)。 - 容器组件:
ListView(列表)、GridView(网格列表)、TabView(标签页)。
- 基础组件:
-
QML 示例(简单窗口) :
qml
import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { width: 800 height: 600 title: "Qt Quick 示例" Column { anchors.centerIn: parent spacing: 20 Text { text: "Hello Qt Quick!" font.pointSize: 24 } Button { text: "点击我" onClicked: { console.log("按钮被点击"); text = "已点击"; } } } }
2. QML 与 C++ 交互
Qt Quick 应用中,C++ 负责业务逻辑(如数据处理、网络请求),QML 负责界面展示,两者通过以下方式交互:
-
C++ 类注册到 QML :
-
继承
QObject,用Q_OBJECT宏,声明信号槽和Q_INVOKABLE函数。 -
在 C++ 中注册:
qmlRegisterType<MyClass>("com.example", 1, 0, "MyClass");。 -
在 QML 中导入并使用: qml
import com.example 1.0 MyClass { id: myObj } Button { onClicked: myObj.doSomething(); // 调用 C++ 函数 }
-
-
QML 调用 C++ 函数 :
- 用
Q_INVOKABLE声明 C++ 函数(可被 QML 直接调用)。 - 信号槽:C++ 信号可触发 QML 函数,QML 信号可连接 C++ 槽函数。
- 用
-
C++ 访问 QML 对象 :
-
通过
QQmlEngine+QQmlComponent加载 QML 文件,获取 QML 对象:cpp
QQmlEngine engine; QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml")); QObject *qmlObj = component.create(); qmlObj->setProperty("text", "Hello from C++"); // 设置 QML 对象属性 QMetaObject::invokeMethod(qmlObj, "qmlFunction"); // 调用 QML 函数
-
五、Qt 工程管理与构建
1. QMake 与 .pro 文件
QMake 是 Qt 传统构建工具,通过 .pro 文件配置工程:
pro
QT += core gui widgets network sql // 依赖的 Qt 模块
TARGET = MyApp // 目标文件名
TEMPLATE = app // 工程类型(app 应用程序,lib 库)
SOURCES += main.cpp mainwindow.cpp // 源文件
HEADERS += mainwindow.h // 头文件
FORMS += mainwindow.ui // UI 文件(Qt Designer 生成)
RESOURCES += resources.qrc // 资源文件(图片、音频等)
2. CMake (Qt 6 推荐)
CMake 是跨平台构建工具,Qt 6 推荐使用,配置文件 CMakeLists.txt:
cmake
cmake_minimum_required(VERSION 3.16)
project(MyApp VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 Qt 模块
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Network Sql)
qt_standard_project_setup()
# 添加可执行文件
qt_add_executable(MyApp
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
# 链接 Qt 库
target_link_libraries(MyApp PRIVATE Qt6::Core Qt6::Widgets Qt6::Network Qt6::Sql)
# 安装配置(可选)
install(TARGETS MyApp
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
3. 资源文件(.qrc)
用于将图片、音频、QML 文件等打包到可执行文件中,避免依赖外部文件:
-
创建
.qrc文件,添加资源:xml
<RCC> <qresource prefix="/images"> <file>logo.png</file> </qresource> <qresource prefix="/qml"> <file>main.qml</file> </qresource> </RCC> -
在代码中访问资源:
QIcon(":/images/logo.png")(前缀 + 文件名)。
六、Qt 调试与优化
1. 调试技巧
- Qt Creator 调试:设置断点、单步执行、查看变量值、监控信号槽连接(通过 "Debug> Qt Debugging > Signal/Slot Logger")。
- 日志输出 :使用
qDebug()、qInfo()、qWarning()、qCritical()输出日志,可通过QT_MESSAGE_PATTERN自定义日志格式。 - 内存泄漏检测 :
- Windows:使用 Visual Studio 内存泄漏检测工具。
- Linux/macOS:使用 Valgrind(
valgrind --leak-check=full ./MyApp)。
2. 性能优化
- UI 优化 :减少不必要的重绘(
update()而非repaint())、使用布局而非硬编码坐标、避免在主线程执行耗时操作。 - 容器优化 :优先使用
QList/QHash而非std::vector/std::map(Qt 容器针对 Qt 类型优化)。 - 网络优化 :使用
QNetworkAccessManager连接池、压缩网络数据、异步请求避免阻塞。 - 数据库优化 :使用预处理语句(
prepare())、索引优化、批量操作而非单条插入。
七、常见问题与注意事项
- MOC 相关错误 :忘记添加
Q_OBJECT宏、头文件未加入工程、Qt Creator 未重新运行 qmake(右键工程 > Run qmake)。 - 信号槽连接失败 :信号 / 槽函数参数不匹配、发送者 / 接收者未实例化、跨线程未使用
QueuedConnection。 - 中文乱码 :使用
QStringLiteral("中文")而非"中文"(避免编码问题)、确保文件编码为 UTF-8。 - 跨平台兼容性 :避免使用平台特定 API(如 Windows 的
Win32函数)、文件路径使用QDir::separator()而非硬编码/或\。 - 内存泄漏 :QObject 派生类未设置父子关系、线程未正确退出、
QNetworkReply/QSqlQuery等对象未手动deleteLater()。
八、学习资源
- 官方文档 :Qt 官方文档(权威、全面,支持 Qt 5/6 切换)。
- 书籍:《Qt 5 编程入门》《C++ GUI Qt 4 编程》(经典入门)、《Qt 6 C++ 开发指南》(Qt 6 最新)。
- 视频教程:Qt 官方 YouTube 频道、B 站 "Qt 教程"(推荐 "豆包编程助手" 等优质博主)。
- 社区:Stack Overflow(Qt 标签)、Qt 中文社区、Qt Forum。
Qt 知识点覆盖广泛,核心是掌握 "信号与槽""元对象系统""父子对象模型" 三大基础,再根据应用场景(GUI、网络、数据库等)深入对应模块。实际开发中需注重跨平台兼容性和性能优化,多结合官方示例和项目实践巩固知识点。
信号与槽机制的底层实现原理是什么?
如何在 Qt 中实现多线程编程?
介绍一下 Qt 中的事件循环机制