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

QT(4)

五、常用类


1. QString字符串类(掌握)

QString是Qt框架的Unicode字符串类,采用UTF-16编码,每个字符为16位QChar。相比C++的std::string,其优势在于:

  •  

    ​跨平台兼容性​​:自动处理不同编码转换

  •  

    ​高效操作​​:内置丰富API(查找/替换/格式化)

  •  

    ​内存安全​​:隐式共享机制减少内存拷贝

​核心API示例​​:

// 类型转换
QString str = QString::number(255, 16);  // "ff"
bool ok;
int num = str.toInt(&ok);  // 255 (ok=true)// 字符串操作
QString s1 = "Qt";
QString s2 = "框架";
QString combined = s1 + " " + s2;  // "Qt 框架"

​中文处理建议​​:

  •  

    文件编码统一为UTF-8

  •  

    使用QStringLiteral宏处理编译时常量字符串

  •  

    参考编码规范文档:腾讯网页链接

​常用API速查​​:

功能

函数示例

整数转字符串

QString::number(255, 16)

字符串转整数

str.toInt(&ok)

字符串拼接

QString("%1%2").arg(a).arg(b)

截取子串

str.mid(2, 3)

大小写转换

str.toUpper()str.toLower()


2. 容器类(掌握)

Qt容器类优化自STL,具有更优的内存管理和跨平台特性,支持隐式共享和线程安全读取。

2.1 顺序容器 - QList

​特性​​:

  •  

    动态数组实现,支持快速头尾操作

  •  

    隐式共享(写时复制)

  •  

    线程安全(只读时多线程安全)

​自定义类型存储示例​​:

// Student类定义
class Student {
public:Student(int id, QString name) : m_id(id), m_name(name) {}int getId() const { return m_id; }QString getName() const { return m_name; }
private:int m_id;QString m_name;
};// 容器操作
QList<Student> students;
students << Student(1, "张三") << Student(2, "李四");
students.insert(1, Student(3, "王五"));  // 插入到索引1位置
students.removeAt(0);  // 删除第一个元素
2.2 关联容器 - QMap类

​特性​​:

  •  

    键值对存储,按键自动排序

  •  

    哈希表实现(QHash更快但无序)

  •  

    支持多值映射(QMultiMap)

​键值操作示例​​:

QMap<QString, QString> config;
config.insert("host", "127.0.0.1");
config.insert("port", "8080");// 批量操作
QMap<QString, QString> newConfig = config;
newConfig["timeout"] = "30";// 迭代访问
for(auto it = config.begin(); it != config.end(); ++it) {qDebug() << it.key() << ":" << it.value();
}

3. Qt数据类型系统
3.1 跨平台数据类型

Qt类型

对应C++类型

说明

quint8

uint8_t

无符号8位整数

qint32

int32_t

有符号32位整数

qreal

double

高精度浮点数

3.2 QVariant统一变量类(熟悉)

​多态数据容器​​:

QVariant var = 42;
var = QString("Hello");
var = QDateTime::currentDateTime();// 类型检查与转换
if(var.canConvert<QString>()) {QString str = var.toString();
}
3.3 QStringList字符串列表

​字符串列表操作​​:

QStringList list = {"Qt", "C++", "GUI"};
list << "Framework";  // 添加元素
list.removeAll("C++"); // 删除所有匹配项

4. 时间与日期处理(掌握)
4.1 QDateTime类

​核心功能​​:

// 获取当前时间
QDateTime now = QDateTime::currentDateTime();// 时间格式化
QString formatted = now.toString("yyyy-MM-dd hh:mm:ss.zzz");// 时间戳操作
qint64 ms = QDateTime::currentMSecsSinceEpoch();  // 毫秒级时间戳// 时间计算
QDateTime future = now.addDays(7);  // 7天后
4.2 时间测量
QElapsedTimer timer;
timer.start();// 执行耗时操作
for(int i=0; i<1000000; ++i) {}qint64 elapsed = timer.elapsed();  // 毫秒级耗时

5. QTimer定时器类(重点)

​实现周期性任务​​:

class Worker : public QObject {Q_OBJECT
public slots:void doWork() {static int count = 0;qDebug() << "Tick:" << ++count;if(count >= 10) emit finished();}
signals:void finished();
};// 使用示例
QTimer *timer = new QTimer(this);
Worker *worker = new Worker();
connect(timer, &QTimer::timeout, worker, &Worker::doWork);
connect(worker, &Worker::finished, timer, &QTimer::deleteLater);
timer->start(1000);  // 每秒触发

​关键特性​​:

  •  

    支持单次/周期性触发

  •  

    精度受系统调度影响(通常±50ms)

  •  

    跨线程需使用moveToThread


附:完整代码示例

​QTimer完整实现​​:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QTimer>
#include <QDateTime>namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;QTimer *timer;private slots:void timeOutSlot();
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);timer = new QTimer(this);// 提前刷新显式控件timeOutSlot();// 设置timer的参数timer->setInterval(500);   // 设置时间间隔timer->setSingleShot(false);    // 设置为周期任务connect(timer,SIGNAL(timeout()),this,SLOT(timeOutSlot()));// 启动定时器timer->start();
}Dialog::~Dialog()
{if(timer->isActive())   // 如果正在运行,则先关闭{timer->stop();}delete timer;delete ui;
}void Dialog::timeOutSlot()
{// 获取当前系统时间,转换为:时:分:秒。返回值为QString字符串QString str = QDateTime::currentDateTime().toString("hh:mm:ss");ui->lcdNumber->display(str);
}


文章转载自:

http://8IjjdPZB.yymLk.cn
http://o2huU9M7.yymLk.cn
http://QNJz3Y4U.yymLk.cn
http://moUuNHc9.yymLk.cn
http://h7R0kTJP.yymLk.cn
http://FVe2dy3J.yymLk.cn
http://pfFhNhJS.yymLk.cn
http://K15yxl9s.yymLk.cn
http://DGgee42h.yymLk.cn
http://KhGj8U1D.yymLk.cn
http://Pr6Ove0Q.yymLk.cn
http://TlQ2vPGt.yymLk.cn
http://UuIV6ksp.yymLk.cn
http://qRw0b91A.yymLk.cn
http://TIRdcUPs.yymLk.cn
http://nDbI9OCU.yymLk.cn
http://AZQj9VcW.yymLk.cn
http://MBodRrLF.yymLk.cn
http://dN4PPb8S.yymLk.cn
http://vogivprT.yymLk.cn
http://5fWlCHzu.yymLk.cn
http://aoh59jrx.yymLk.cn
http://UkAuz54o.yymLk.cn
http://WjmGkzgW.yymLk.cn
http://yb1APEEe.yymLk.cn
http://2ErZTb0e.yymLk.cn
http://9ZkVorrR.yymLk.cn
http://iEjAEXxX.yymLk.cn
http://TDOnrpWK.yymLk.cn
http://Uasv4j8l.yymLk.cn
http://www.dtcms.com/a/384627.html

相关文章:

  • DevOps历程--Drone安装使用详细教程
  • 微信小程序选择图片、视频、音频
  • 【C++上岸】C++常见面试题目--网络篇(第二十三期)
  • mapbox进阶,使用jsts实现平角缓冲区
  • A股大盘数据-20250915分析
  • MySQL服务启动全平台指南:从Windows服务、Linux systemctl到macOS的完整攻略
  • 八、vue3后台项目系列——封装layout页面下切换组件Appmain
  • 学习React-12-useEffect
  • MFC_Button
  • [K8S学习笔记]YAML相关
  • 贪心算法在物联网能耗优化中的应用
  • 使用paddlepaddle-Gpu库时的一个小bug!
  • 从 Linux 到 Kubernetes:操作系统的演变与云原生未来
  • Java网络编程:(socket API编程:TCP协议的 socket API -- 服务器端处理请求的三个步骤)
  • 新能源汽车总装车间案例:四台S7-1200通过无线网桥同步控制16组ET 200SP的秘诀
  • k8s事件驱动运维利器 shell operator
  • GitHub Actions 部署配置
  • java后端工程师进修ing(研一版‖day45)
  • k8s核心资料基本操作
  • Redis 在电商系统中的应用:高并发场景下的架构艺术
  • RK3588:MIPI底层驱动学习——芯外拾遗第一篇:从四个模块到整个“江湖”
  • K8S里的“豌豆荚”:Pod
  • OpenStack 管理与基础操作学习笔记(一):角色、用户及项目管理实践
  • 大数据毕业设计选题推荐-基于大数据的金融数据分析与可视化系统-Spark-Hadoop-Bigdata
  • Python爬虫实战:研究Pandas,构建期货数据采集和分析系统
  • 软考中级习题与解答——第六章_计算机硬件基础(3)
  • Nvidia显卡架构解析与cuda应用生态浅析
  • AppStore 如何上架?iOS 应用发布全流程、uni-app 打包上传 ipa、App Store 审核与多工具组合实战指南
  • 贪心算法应用:卫星链路调度问题详解
  • 基于https的数据加密技术