QT核心类:基础类、GUI类、多媒体与图表、网络与数据库
模块 | 核心类 | 功能描述 | 关键方法/特性 |
---|---|---|---|
QtCore | QObject | 所有 Qt 类的基类,提供信号槽、属性系统、父子关系管理 | signals 、slots 、emit 、setProperty() 、property() 、metaObject() |
QApplication | GUI 应用程序入口,管理事件循环、全局设置、资源加载 | exec() (启动事件循环)、quit() 、setQuitOnLastWindowClosed() | |
QThread | 多线程支持,允许对象在不同线程中运行 | start() 、moveToThread() 、run() | |
QString | Unicode 字符串类,支持国际化、正则表达式、格式化操作 | isEmpty() 、toInt() 、replace() 、sprintf() | |
QVariant | 通用数据容器,可存储多种类型(整型、浮点型、指针等) | type() 、value<T>() 、canConvert<T>() | |
QTimer | 定时器类,支持单次/重复触发事件 | start(int interval) 、stop() 、timeout() (槽函数) | |
QtWidgets | QWidget | 所有 GUI 组件的基类,负责绘制、事件处理、布局管理 | resize() 、show() 、hide() 、setLayout() |
QPushButton | 按钮控件,响应点击事件 | setText() 、setIcon() 、setChecked() (复选框) | |
QVBoxLayout | 垂直布局管理器,自动排列子控件的垂直位置和大小 | addWidget() 、addLayout() 、setContentsMargins() | |
QMessageBox | 标准对话框类,用于显示警告、错误、确认等信息 | critical() 、warning() 、question() 、about() | |
QtGui | QPainter | 图形绘制工具,支持矢量图形和位图渲染 | drawText() 、drawRect() 、fillRect() 、drawImage() |
QColor | 颜色类,表示 RGB/HSV 颜色值 | rgb() 、hsl() 、name() 、isValid() | |
QtNetwork | QTcpSocket | TCP 套接字类,实现基于 sockets 的网络通信 | connectToHost() 、write() 、readAll() 、disconnectFromHost() |
QNetworkRequest | HTTP 请求类,管理 URL、头信息、请求方法等 | setUrl() 、setHeader() 、setMethod() | |
QtSql | QSqlDatabase | 数据库连接管理器,支持多种数据库(SQLite、MySQL 等) | addDatabase() 、open() 、executeQuery() |
QSqlTableModel | 数据模型类,将 SQL 表映射为 GUI 表格控件(如 QTableView ) | setTable() 、select() 、setData() 、headerData() | |
QtMultimedia | QMediaPlayer | 多媒体播放器类,支持音频、视频的播放与控制 | setMedia() 、play() 、pause() 、stop() 、volume() |
QCamera | 摄像头捕获类,访问实时视频流 | startCapture() 、stopCapture() 、setResolution() | |
QtWebKit/QtWebEngine | QWebEngineView | 嵌入式浏览器控件,渲染 HTML/CSS/JavaScript 内容 | load(QUrl) 、evaluateJavaScript() 、page() (获取网页对象) |
1. 基础核心类
1. QObject
-
功能:所有 Qt 类的基类,提供信号槽机制、对象树内存管理、事件处理。
-
核心特性:
-
父子对象:父对象销毁时自动销毁子对象。
-
信号与槽:通过
connect
实现对象间通信
-
class MyObject : public QObject {
Q_OBJECT
signals:
void valueChanged(int newValue);
public slots:
void setValue(int value) { emit valueChanged(value); }
};
MyObject obj1, obj2;
QObject::connect(&obj1, &MyObject::valueChanged, &obj2, &MyObject::setValue);
2. QString
-
功能:Unicode 字符串处理,支持高效操作。
-
常用方法:
-
arg()
:格式化字符串。 -
toInt()
,toDouble()
:类型转换。
-
QString name = "Alice";
int age = 30;
QString info = QString("Name: %1, Age: %2").arg(name).arg(age); // "Name: Alice, Age: 30"
3. QList<T>
-
功能:动态数组容器,支持快速插入和遍历。
QList<int> numbers = {1, 2, 3};
numbers.append(4);
for (int num : numbers) {
qDebug() << num; // 输出 1, 2, 3, 4
}
4. QVariant
-
功能:通用数据类型容器,支持存储多种类型。
QVariant data = 42; // 存储整数
qDebug() << data.toInt(); // 输出 42
data = "Hello"; // 存储字符串
qDebug() << data.toString(); // 输出 "Hello"
2. 图形界面类
1. QWidget
-
功能:所有窗口和控件的基类。
-
示例(创建窗口):
QWidget window;
window.setWindowTitle("My App");
window.resize(400, 300);
window.show();
2. QMainWindow
-
功能:主窗口框架,集成菜单栏、工具栏等。
QMainWindow mainWindow;
QMenuBar *menuBar = mainWindow.menuBar();
QMenu *fileMenu = menuBar->addMenu("File");
QAction *openAction = fileMenu->addAction("Open");
mainWindow.show();
3. QPushButton
与布局
-
示例(按钮 + 布局):
QWidget window;
QPushButton *button = new QPushButton("Click Me", &window);
QLabel *label = new QLabel("Status: Ready", &window);
QVBoxLayout *layout = new QVBoxLayout(&window);
layout->addWidget(button);
layout->addWidget(label);
QObject::connect(button, &QPushButton::clicked, [label]() {
label->setText("Status: Clicked!");
});
3. 信号与槽高级用法
1. 自定义信号与参数
-
示例:
// 包含QObject基类,所有Qt对象都必须继承自QObject
#include <QObject>
// 包含调试输出工具
#include <QDebug>
// Sensor类继承自QObject,使其具备信号槽能力
class Sensor : public QObject {
Q_OBJECT // 必须包含此宏以启用信号槽机制和元对象系统
public:
// 构造函数(隐式默认构造函数)
Sensor(QObject *parent = nullptr) : QObject(parent) {}
signals:
// 声明温度变化信号,参数为double类型
void temperatureChanged(double temp);
public slots:
// 公共成员函数,用于模拟读取数据
void readData() {
// 发射temperatureChanged信号,传递25.5作为参数
emit temperatureChanged(25.5);
}
};
// Display类继承自QObject,用于显示数据
class Display : public QObject {
Q_OBJECT
public:
// 构造函数(隐式默认构造函数)
Display(QObject *parent = nullptr) : QObject(parent) {}
public slots:
// 声明槽函数,接收温度值并输出
void updateDisplay(double temp) {
// 使用qDebug输出调试信息
qDebug() << "Current temp:" << temp;
}
};
// 全局对象声明(此处需注意生命周期管理)
Sensor sensor; // 默认构造
Display display; // 默认构造
// 主函数入口
int main(int argc, char *argv[]) {
// 初始化Qt应用程序
QApplication app(argc, argv);
// 连接信号与槽
QObject::connect(&sensor, &Sensor::temperatureChanged,
&display, &Display::updateDisplay);
// 触发传感器数据读取
sensor.readData(); // 输出 "Current temp: 25.5"
return app.exec();
}
2. 跨线程通信
-
示例(使用
QThread
):
class Worker : public QObject {
Q_OBJECT
public slots:
void doWork() {
// 耗时操作
emit resultReady("Done");
}
signals:
void resultReady(const QString &result);
};
QThread thread;
Worker worker;
worker.moveToThread(&thread);
QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);
QObject::connect(&worker, &Worker::resultReady, [](const QString &result) {
qDebug() << "Result:" << result;
QCoreApplication::quit();
});
thread.start();
4. 网络与数据库
1. QNetworkAccessManager
-
示例(HTTP GET 请求):
QNetworkAccessManager manager;
QObject::connect(&manager, &QNetworkAccessManager::finished, [](QNetworkReply *reply) {
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "Response:" << reply->readAll();
}
});
manager.get(QNetworkRequest(QUrl("https://api.example.com/data")));
2. QSqlDatabase
-
示例(SQLite 数据库操作):
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydb.sqlite");
if (db.open()) {
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
query.exec("INSERT INTO users (name) VALUES ('Alice')");
}
5. 多媒体与图表
1. QMediaPlayer
-
示例(播放音频):
QMediaPlayer player;
QAudioOutput audioOutput;
player.setAudioOutput(&audioOutput);
player.setSource(QUrl::fromLocalFile("music.mp3"));
player.play();
2. QChart
-
示例(绘制折线图):
QLineSeries *series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
QChart *chart = new QChart();
chart->addSeries(series);
chart->createDefaultAxes();
QChartView *chartView = new QChartView(chart);
chartView->show();
6. 工具类
1. QFile
-
示例(文件读写):
QFile file("data.txt");
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream << "Hello, Qt!";
file.close();
}
2. QTimer
-
示例(定时任务):
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, []() {
qDebug() << "Timer triggered!";
});
timer.start(1000); // 每隔 1 秒触发