当前位置: 首页 > news >正文

QT常用类解析

一、基础数据类型类

Qt 提供了一系列替代 C++ 标准库的数据类型,更适合跨平台开发和 Qt 生态。

1.1 QString

  • 特性:Qt 中最核心的字符串类,默认支持 Unicode 编码,无需担心多语言字符集问题。
  • 功能
    • 提供丰富的字符串操作:拼接(+ 或 append())、分割(split())、替换(replace())、查找(indexOf())等。
    • 支持格式化输出(arg() 方法,比 sprintf 更安全)。
    • 可与 C 风格字符串(const char*)互转(toUtf8()fromUtf8())。
  • 示例
QString str = "Hello";
str.append(" Qt"); // 结果:"Hello Qt"
QString formatted = QString("Version: %1, Size: %2").arg(5.15).arg(1024);
// formatted 结果:"Version: 5.15, Size: 1024"

1.2 容器类(QList、QVector、QMap 等)

Qt 容器类比 C++ 标准容器(如 std::vector)更轻量,且支持 Qt 元对象系统。

  • QList

    • 特性:最常用的动态数组容器,内部实现为数组 + 链表混合结构,支持快速随机访问和中间插入。
    • 功能:存储任意 Qt 类型(如 QStringint 等),提供 append()insert()removeAt() 等操作。
  • QVector

    • 特性:连续内存存储的动态数组,适合频繁随机访问场景(性能优于 QList)。
    • 功能:与 QList 接口类似,但内存布局更紧凑,适合存储基础数据类型。
  • QMap

    • 特性:键值对映射容器,基于红黑树实现,按键自动排序。
    • 功能:支持快速查找(value())、插入(insert())、遍历,键值可自定义类型(需实现比较运算符)。
  • 示例

QList<QString> fruits;
fruits << "Apple" << "Banana"; // 插入元素
fruits.removeOne("Banana"); // 移除元素QMap<int, QString> idToName;
idToName.insert(1, "Alice");
QString name = idToName.value(1); // 结果:"Alice"

二、窗口与部件类

Qt 的 GUI 功能基于部件(Widget)体系,所有可视化元素均继承自 QWidget

2.1 QWidget

  • 特性:所有用户界面对象的基类,支持窗口大小调整、移动、事件处理等基础功能。
  • 功能
    • 作为容器承载其他部件(如按钮、文本框)。
    • 处理鼠标、键盘事件(重写 mousePressEvent()keyPressEvent() 等)。
    • 支持样式表(setStyleSheet())自定义外观。
  • 示例
// 创建一个简单窗口
QWidget *window = new QWidget;
window->setWindowTitle("Basic Window");
window->resize(400, 300); // 设置大小
window->show(); // 显示窗口

2.2 QMainWindow

  • 特性:主窗口类,自带菜单栏、工具栏、状态栏和中心部件区域,适合作为应用程序主界面。
  • 功能
    • 通过 setCentralWidget() 设置中心内容部件。
    • 支持添加菜单栏(menuBar())、工具栏(addToolBar())、状态栏(statusBar())。
  • 示例
QMainWindow *mainWin = new QMainWindow;
mainWin->setWindowTitle("Main Window");
// 设置中心部件
QTextEdit *edit = new QTextEdit;
mainWin->setCentralWidget(edit);
// 添加状态栏
mainWin->statusBar()->showMessage("Ready");
mainWin->show();

2.3 常用交互部件

  • QPushButton:按钮部件,支持点击事件(clicked() 信号)。
  • QLineEdit:单行文本输入框,用于获取用户输入(text() 方法获取内容)。
  • QTextEdit:多行文本编辑框,支持富文本和换行。
  • QComboBox:下拉列表框,通过 addItem() 添加选项,currentText() 获取选中项。
  • 示例
QPushButton *btn = new QPushButton("Click Me");
QLineEdit *edit = new QLineEdit;
// 点击按钮时,将输入框内容显示到控制台
connect(btn, &QPushButton::clicked, [=]() {qDebug() << edit->text();
});

三、布局管理类

布局管理类用于自动调整部件的位置和大小,确保界面在窗口缩放时保持合理布局。

3.1 QVBoxLayout / QHBoxLayout

  • 特性:垂直 / 水平布局,按顺序排列部件(垂直布局从上到下,水平布局从左到右)。
  • 功能
    • 通过 addWidget() 添加部件,addStretch() 添加伸缩项(挤压空白区域)。
    • 支持设置部件间距(setSpacing())和边距(setContentsMargins())。
  • 示例
QWidget *window = new QWidget;
QVBoxLayout *layout = new QVBoxLayout(window); // 垂直布局
layout->addWidget(new QPushButton("Button 1"));
layout->addWidget(new QPushButton("Button 2"));
layout->addStretch(); // 底部留白
window->show();

3.2 QGridLayout

  • 特性:网格布局,按行和列排列部件,适合规则排列的界面(如表单)。
  • 功能:通过 addWidget(widget, row, col, rowSpan, colSpan) 指定部件位置和跨行列数。
  • 示例
QGridLayout *grid = new QGridLayout;
grid->addWidget(new QLabel("Name:"), 0, 0); // 第0行第0列
grid->addWidget(new QLineEdit, 0, 1); // 第0行第1列
grid->addWidget(new QLabel("Age:"), 1, 0); // 第1行第0列
grid->addWidget(new QLineEdit, 1, 1); // 第1行第1列

四、信号与槽相关类

信号与槽是 Qt 最核心的通信机制,依赖元对象系统实现,用于部件间或对象间的交互。

4.1 QObject

  • 特性:所有支持信号与槽的类的基类,提供元对象系统支持。
  • 功能
    • 定义信号(signals 关键字)和槽(slots 关键字)。
    • 通过 connect() 关联信号与槽,实现事件响应。
    • 支持对象树管理(父对象销毁时自动销毁子对象)。
  • 示例
class MyObject : public QObject {Q_OBJECT // 必须添加,启用元对象功能
signals:void valueChanged(int value); // 信号声明(无需实现)
public slots:void onValueChanged(int value) { // 槽定义qDebug() << "Value:" << value;}
};// 使用
MyObject obj;
connect(&obj, &MyObject::valueChanged, &obj, &MyObject::onValueChanged);
emit obj.valueChanged(100); // 发射信号,触发槽函数

4.2 QSignalMapper

  • 特性:信号转发器,用于将多个相似信号映射到同一槽函数,并传递区分参数。
  • 功能:解决 “多个按钮点击后执行相同逻辑但需区分来源” 的场景。
  • 示例
QSignalMapper *mapper = new QSignalMapper(this);
QPushButton *btn1 = new QPushButton("Btn1");
QPushButton *btn2 = new QPushButton("Btn2");// 关联按钮点击信号到mapper
connect(btn1, &QPushButton::clicked, mapper, QOverload<>::of(&QSignalMapper::map));
connect(btn2, &QPushButton::clicked, mapper, QOverload<>::of(&QSignalMapper::map));// 设置映射参数
mapper->setMapping(btn1, 1);
mapper->setMapping(btn2, 2);// 映射到槽函数
connect(mapper, &QSignalMapper::mappedInt, [](int id) {qDebug() << "Button" << id << "clicked";
});

五、文件与 IO 类

Qt 提供跨平台的文件操作类,屏蔽了不同系统的文件路径、编码等差异。

5.1 QFile

  • 特性:文件操作核心类,支持读写本地文件、资源文件(.qrc)。
  • 功能
    • 打开 / 关闭文件(open()close()),支持多种打开模式(QIODevice::ReadOnlyWriteOnly 等)。
    • 读写字节数据(read()write())。
  • 示例
QFile file("test.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {file.write("Hello Qt File");file.close();
}// 读取文件
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QByteArray data = file.readAll();qDebug() << data; // 输出:"Hello Qt File"
}

5.2 QTextStream / QDataStream

  • QTextStream:文本流,用于读写文本数据(自动处理编码,默认 Unicode)。
    • 支持格式化输出(<< 运算符,类似 cout)。
  • QDataStream:数据流,用于读写二进制数据(如整数、浮点数、自定义结构体),适合序列化。
  • 示例
// 文本流写入
QFile textFile("log.txt");
textFile.open(QIODevice::WriteOnly);
QTextStream out(&textFile);
out << "Name: " << "Qt" << ", Version: " << 5.15 << endl;// 数据流写入
QFile dataFile("data.bin");
dataFile.open(QIODevice::WriteOnly);
QDataStream dataOut(&dataFile);
dataOut << 100 << 3.14f << QString("Qt");

六、网络类

Qt 网络模块(Qt Network)提供跨平台的网络通信功能,支持 TCP、UDP、HTTP 等协议。

6.1 QTcpSocket / QTcpServer

  • 特性:TCP 通信类,QTcpServer 用于创建服务器监听连接,QTcpSocket 用于客户端 / 服务器数据传输。
  • 功能
    • QTcpServerlisten() 监听端口,newConnection() 信号触发新连接。
    • QTcpSocketconnectToHost() 连接服务器,readyRead() 信号触发数据读取。
  • 示例(服务器)
QTcpServer server;
server.listen(QHostAddress::Any, 8080); // 监听8080端口
connect(&server, &QTcpServer::newConnection, [&]() {QTcpSocket *socket = server.nextPendingConnection();connect(socket, &QTcpSocket::readyRead, [=]() {qDebug() << "Received:" << socket->readAll();socket->write("Hello Client"); // 回复客户端});
});

6.2 QNetworkAccessManager

  • 特性:HTTP/HTTPS 客户端类,支持 GET、POST 等请求,适合访问网络 API。
  • 功能:通过 get()post() 发送请求,finished() 信号获取响应(QNetworkReply)。
  • 示例
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished, [](QNetworkReply *reply) {if (reply->error() == QNetworkReply::NoError) {qDebug() << "HTTP Response:" << reply->readAll();}reply->deleteLater();
});
manager->get(QNetworkRequest(QUrl("https://www.qt.io"))); // 发送GET请求

七、图形与绘图类

Qt 提供 2D 绘图框架,支持在部件上绘制自定义图形。

7.1 QPainter

  • 特性:绘图核心类,用于在 QWidgetQImage 等绘图设备上绘制图形。
  • 功能:支持绘制直线(drawLine())、矩形(drawRect())、文本(drawText())等,可设置画笔(QPen)和画刷(QBrush)。
  • 示例
// 在QWidget的paintEvent中绘图
void MyWidget::paintEvent(QPaintEvent *event) {Q_UNUSED(event);QPainter painter(this);painter.setPen(QPen(Qt::red, 2)); // 红色画笔,线宽2painter.setBrush(QBrush(Qt::yellow)); // 黄色画刷painter.drawRect(50, 50, 100, 80); // 绘制矩形painter.drawText(70, 90, "Qt"); // 绘制文本
}

7.2 QImage / QPixmap

  • QImage:像素级图像处理类,适合频繁修改图像(如缩放、滤镜),支持多线程操作。
  • QPixmap:屏幕显示优化的图像类,与平台绘图系统关联,适合快速显示(如界面图标)。
  • 示例
// 加载图片并显示
QPixmap pixmap("image.png");
QLabel *label = new QLabel;
label->setPixmap(pixmap.scaled(200, 200, Qt::KeepAspectRatio)); // 缩放图片

八、数据库类(Qt SQL)

Qt SQL 模块提供数据库访问功能,支持 MySQL、SQLite、PostgreSQL 等主流数据库。

8.1 QSqlDatabase

  • 特性:数据库连接类,用于建立和管理与数据库的连接。
  • 功能addDatabase() 注册数据库驱动,setDatabaseName() 设置数据库名,open() 打开连接。
  • 示例
// 连接SQLite数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydb.db"); // 数据库文件
if (!db.open()) {qDebug() << "Database error:" << db.lastError().text();
}

8.2 QSqlQuery

  • 特性:数据库查询类,用于执行 SQL 语句(SELECT、INSERT、UPDATE 等)。
  • 功能exec() 执行 SQL,next() 遍历查询结果,value() 获取字段值。
  • 示例
QSqlQuery query;
// 创建表
query.exec("CREATE TABLE IF NOT EXISTS users (id INT, name TEXT)");
// 插入数据
query.exec("INSERT INTO users VALUES (1, 'Qt')");
// 查询数据
query.exec("SELECT * FROM users");
while (query.next()) {int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << name; // 输出:1 "Qt"
}

九、多线程类

Qt 提供安全的多线程机制,避免直接操作原生 C++ 线程的复杂性。

9.1 QThread

  • 特性:线程类,用于创建和管理线程,支持信号与槽跨线程通信。
  • 功能
    • 子类化 QThread 并重写 run() 方法定义线程逻辑。
    • 通过 start() 启动线程,quit() 退出线程。
  • 示例
class MyThread : public QThread {Q_OBJECT
protected:void run() override {// 线程逻辑(耗时操作)for (int i = 0; i < 10; ++i) {emit progress(i); // 发送进度信号msleep(100); // 休眠100ms}}
signals:void progress(int value);
};// 使用
MyThread *thread = new MyThread;
connect(thread, &MyThread::progress, [](int v) {qDebug() << "Progress:" << v; // 主线程接收信号
});
thread->start(); // 启动线程
http://www.lryc.cn/news/619352.html

相关文章:

  • ubuntu20.04下C++实现点云的多边形区域过滤(2种实现:1、pcl的CropHull滤波器;2、CUDA上实现射线法)
  • 在Ubuntu24.04中使用ssh连接本地git仓库到github远程仓库
  • C++QT HTTP与HTTPS的使用方式
  • 【网络安全测试】OWASP ZAP web安全测试工具使用指导及常用配置(有关必回)
  • Spring事务管理实战:从注解到进阶
  • Spring 源码学习(十)—— DispatcherServlet
  • 【一步AI】模型压缩:减小模型体积与计算量
  • YOLOv8 级联检测:在人脸 ROI 内检测眼镜(零改源码方案)
  • 第十六届蓝桥杯青少组C++省赛[2025.8.9]第二部分编程题(1 、庆典队列)
  • Excel怎么筛选重复项?【图文详解】查找/删除重复项?查找重复项公式?如何去重?
  • [QtADS]解析demo.pro
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • Electron自定义菜单栏及Mac最大化无效的问题解决
  • XML头部声明发送者信息的实现方法
  • C# 微软依赖注入 (Microsoft.Extensions.DependencyInjection) 详解
  • CV 医学影像分类、分割、目标检测,之【肝脏分割】项目拆解
  • windows常用的快捷命令
  • 机器学习实战·第三章 分类(2)
  • docker 容器内编译onnxruntime
  • git clone 支持在命令行临时设置proxy
  • CV 医学影像分类、分割、目标检测,之【腹腔多器官语义分割】项目拆解
  • 何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
  • Video_AVI_Packet(2)
  • 基于RTSP|RTMP低延迟视频链路的多模态情绪识别系统构建与实现
  • 日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理
  • 进阶向:Python编写自动化邮件发送程序
  • Jenkins一直无法启动,怎么办?
  • 论文分享 | Flashboom:一种声东击西攻击手段以致盲基于大语言模型的代码审计
  • 守拙以致远:个人IP的长青之道|创客匠人
  • Hive 创建事务表的方法