QT常用类

五、常用类

  1. QString 字符串类(掌握)

QString是Qt的字符串类,与C++的std::string相比, 不再使用ASCII编码。QString使用的是Unicode编码

QString中每个字符都是一个16位的QChar,而不是8位的char。

QString完全支持中文,但是有序不同的技术可能会采用不同的中文编码。有时候也会遇到中文编码的一致性问题。

如果过后续出现中文乱码的问题。

从此乱码是路人

Qt中对C++的类进行重写是,充分考虑到C++程序员的编程习惯,因此QString几乎支持所有的std::string的API。除此之外也会新增一些函数。

// int → QString
// 参数1:要转化的数字
// 参数2:转换的进制
QString	number(int n, int base = 10)

// int → QString
// 参数1:要转换的数字
// 参数2:进制
// 返回值:转换后的QString
QString &	setNum(int n, int base = 10)

// QString → int
// 参数1:转换成功或失败,成功设置为true、失败参数设置为false
// 参数2:进制
// 返回值:转换后的int数值。转换失败返回0
int	toInt(bool * ok = 0, int base = 10) const

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
    ui->setupUi(this);QString str = "안녕하세요";// int -> QString 静态成员函数int a = 255;qDebug() << QString::number(a);qDebug() << QString::number(a,2);qDebug() << QString::number(a,16);qDebug() << QString::number(a,8);// int → QString 成员函数qDebug() << str.setNum(a);// QString -> intbool result = false;
    str = "hello";qDebug() << str.toInt(&result);qDebug() << result ;
}Dialog::~Dialog()
{delete ui;
}

2、容器类

Qt重写了C++的STL中的容器类,相比较于C++STL的容器类,Qt的容器类更加轻巧,安全和易于使用。因为Qt的容器类进行了速度和存储化的优化,减少了可执行文件的生成体积,几乎全面兼容STL容器类的API接口。并且是线程安全的。可以同时被多个线程访问。

2.1 顺序容器——QList类(掌握)

本节课程内容使用QList类存储Student元素,Student是自定义C++类型,在Qt项目中创建个C++的类。

  1. 在Qt Creator中选中项目名称,鼠标右键,点击添加新文件。

  1. 在弹出的窗口中,按照下图所示进行操作。

  1. 在弹出的窗口中输入类名(大驼峰/帕斯卡命名法)

  1. 在项目管理界面中点击”完成“。可以看到新的文件在项目中存在了。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 创建QList对象
    QList<Student> lis;
    Student s1(1,"张三","挖掘机");
    Student s2(2,"李四","美容美发");
    Student s3(3,"王五","电气焊");
    Student s4(4,"赵六","新东方厨师");
    Student s5(5,"韩七","汽修");    // 插入对象,向后插入元素(链式调用)
    lis << s1 << s2 << s3 << s4;    // 插入
    lis.insert(1,s5);    // 删除元素
    lis.removeFirst(); // 删除第一个
    lis.removeLast();  // 删除最后一个    lis.removeAt(1);    // 删除第二个元素//    lis.removeAll(s2); // 删除所有相同的元素
//    lis.removeOne(s4);  // 删除所有相同元素的第一个    // 遍历
    for(int i = 0;i < lis.count();i++)
    {
        Student s = lis.at(i);
        qDebug() << s.getId() << s.getName() << s.getMajor() ;
    }    // C++迭代器遍历
    for(QList<Student>::iterator iter = lis.begin(); iter != lis.end();iter++)
    {
        Student s = *iter;
        qDebug() << s.getId() << s.getName() << s.getMajor() ;
    }    // Java迭代器
//    QListIterator<T>  // 只读迭代器
//    QMutableListIterator // 读写迭代器
    // 创建一个Java迭代器对象,参数为容器对象
    QListIterator<Student> iter(lis);
    while(iter.hasNext()) // 判断当前迭代器指针后面是否有可用元素
    {
        Student s = iter.next(); // 向后移动当前迭代器,并取出元素
        qDebug() << s.getId() << s.getName() << s.getMajor() ;
    }}Dialog::~Dialog()
{
    delete ui;
}

2.2 关联容器——QMap类(掌握)

重新实现了STL中std::map类,QMap也兼容map类的API,也增加一些新的Qt的API。

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);    QMap<QString,QString> map; // 创建对象    // 插入数据
    map.insert("张三","挖掘机");
    map.insert("冠芝","美容美发");
    map.insert("宵宾","电气焊");
    map.insert("极强","要饭");
    map.insert("昌平","捡破烂");
    map.insert("华子哥","抽华子");    // 如果容器中的元素支持qDebug输出,则容器本身也支持输出。
    qDebug () << map;
    // 删除键值对
    // 返回值为删除的键值对数量
    qDebug() << map.remove("张三");
    qDebug() << map.remove("张三");    // 判断某个键值对在不在
    qDebug() << map.contains("张三"); // false
    qDebug() << map.contains("冠芝"); // true    if(map.contains("华子哥"))
    {
        map["华子哥"] = "抽电子烟";
    }
    qDebug () << map;    qDebug() << map.value("张三","没有没有");
    qDebug() << map.value("极强","没有没有");    // STL 迭代器遍历 C++
    for(QMap<QString,QString>::iterator iter = map.begin();
        iter != map.end(); iter++)
    {
        // 输出键与值
        qDebug() << iter.key() << iter.value();
    }    // java 迭代器
    QMapIterator<QString,QString> iter(map);
    while(iter.hasNext())
    {
       iter.next();
       qDebug() << iter.key() << iter.value() ;
    }
}Dialog::~Dialog()
{
    delete ui;
}

3、Qt数据类型(熟悉)

3.1 跨平台数据类型

Qt是一个跨平台的开发框架,所以必须要保证各个平台的数据类型长度保持一致,因此Qt对常见数据类型进行了新的定义符号。

在Qt环境下,可以直接使用。

3.2 QVariant 统一变量类

QVariant类型可以与Qt常见的类型完成相互转换,因此此类型的函数具有类似于多态的性质。

    qint64 a = 123;
    QVariant v(a);
    QString str = v.toString(); // 转换成字符串
    qDebug() << str ; // 字符串123    v = str;
    int b = v.toInt(); // 转换成int
    qDebug() << b;      // 整型:123

4、时间与日期处理(掌握)

Qt中用QDate类处理日期,使用QTime类处理时间,使用QDateTime处理时间和日期。已QDateTime进行讲解。

需要注意的是,QDateTime的数据来自系统日期和时间,修改时间会影响到QDateTime的数据。

常用函数:

// 返回1970年1月1日00:00:00到现在的毫秒数
qint64 QDateTime::​currentMSecsSinceEpoch()[static]

1、时间戳作用,计算代码的运行时间

  1. 时间戳的其他作用。

可以使用时间戳作为随机数的种子,但是需要注意,我们计算机的随机数都是伪随机。不是真正的随机数。计算机中无法做到真正的随机数。

获取当前的日期和时间对象

// 返回一个包含当前日期和时间的QDateTime对象
QDateTime QDateTime::​currentDateTime()

秒:ss

// 拿到当前日期和时间的对象后,可以提取当前的日期和时间
// 格式化输出年月日,时分秒
QString QDateTime::​toString(const QString & format) const

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    qint64 start = QDateTime::currentMSecsSinceEpoch();
    ui->setupUi(this);
    qDebug() << QDateTime::currentMSecsSinceEpoch() - start ;    // 使用时间戳作为随机数种子
    qsrand(start);
    // 生成随机数(1-100)
    qDebug() <<  qrand()%101;    QDateTime dt = QDateTime::currentDateTime();
    qDebug() <<  dt.toString("yyyy年MM月dd日 hh时mm分ss秒");}Dialog::~Dialog()
{
    delete ui;
}

其他的日期和时间的相关ui组件:

5、定时器类QTimer(掌握)

QTimer类可以实现一个延时任务,周期任务。

QTimer的常用属性有:

  • active : const bool

当前定时器的运行状态

  • interval : int

时间间隔,单位毫秒。

  • singleShot : bool

表示当前当前定时器,是否是一次性的。

QTimer类的常用函数

// 构造函数 堆区开辟
QTimer::​QTimer(QObject * parent = 0)

QLCDNumber组件

使用这个组件,显示出11:56:24 这样子的效果。

//QLCDNumber 的显示槽函数
void	display(const QString & s)[slot]

// 定时器触发信号,时间到了就发送该信号
void QTimer::​timeout()[signal]

// 启动定时器
void QTimer::​start()[slot]

// 停止计时器
void QTimer::​stop()[slot]

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    timeOutSlot(); // 提前刷新显示控件
//    ui->lcdNumber->display("12:00:00");    timer = new QTimer(this);
    // 设置定时器参数
    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://www.mzph.cn/news/699347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探究node搭建socket服务器

自从上篇中sokect实现了视频通话&#xff0c;但是是使用ws依赖库实现的服务端&#xff0c;所以最近再看ws源码&#xff0c;不看不知道&#xff0c;一看很惊讶。 接下来一点点记录一下&#xff0c;如何搭建一个简易的服务端socket&#xff0c;来实现上次的视频通讯。 搭建一个…

详解AP3216C(三合一sensor: 光照、距离、照射强度)驱动开发

目录 概述 1 认识AP3216C 1.1 AP3216C特性 1.2 AP3216C内部结构 1.3 AP3216C 硬件电路 1.4 AP3216C工作时序 1.4.1 I2C 写数据协议 1.4.2 I2C 读数据协议 1.5 重要的寄存器 1.5.1 系统配置寄存器 1.5.2 和中断相关寄存器 1.5.3 IR数据寄存器 1.5.4 ALS 数据寄存器 …

代码随想录算法训练营第59天 | 583.两个字符串的删除操作 + 72.编辑距离 + 编辑距离总结篇

今日任务 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 583.两个字符串的删除操作 - Medium 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以…

【数学建模规则】2024年第九届数维杯大学生数学建模挑战赛参赛指南

一、竞赛介绍 数维杯大学生数学建模挑战赛每年分为两场&#xff0c;每年上半年为数维杯国赛&#xff08;5月&#xff0c;俗称小国赛&#xff09;&#xff0c;下半年为数维杯国际赛(11月)&#xff0c;2023年第八届数维杯大学生数学建模挑战赛共有近1.4万名学生参赛&#xff0c;…

Unity之PUN2插件实现多人联机射击游戏

目录 &#x1f4d6;一、准备工作 &#x1f4fa;二、UI界面处理 &#x1f4f1;2.1 登录UI并连接PUN2服务器 &#x1f4f1;2.2 游戏大厅界面UI &#x1f4f1;2.3 创建房间UI &#x1f4f1;2.4 进入房间UI &#x1f4f1;2.5 玩家准备状态 &#x1f4f1;2.6 加载战斗场景…

vue proxy解决跨域问题

https://blog.csdn.net/tttttrrrhh/article/details/127685318 cims系统ui

java 面向对象-上:类的结构之二

类的设计中&#xff0c;两个重要结构之二&#xff1a;方法 方法 描述类应该具的功能。 比如&#xff1a;Math类&#xff1a;sqrt()\random() \... Scanner类&#xff1a;nextXxx() ... Arrays类&#xff1a;sort() \ binarySearch() \ toString() \ equals() \ ... 1.举例 p…

[Java 项目亮点] 三层限流设计

思路来源&#xff1a;bilibili 河北王校长 文章目录 面试官可能会问你能详细介绍一下Nginx的http_limit_req_module模块吗&#xff1f;你能解释一下如何在Nginx中配置http_limit_req_module模块吗&#xff1f;你知道如何调整Nginx的http_limit_req_module模块以适应不同的业务需…

【服务器数据恢复】通过reed-solomon算法恢复raid6数据的案例

服务器数据恢复环境&#xff1a; 一台网站服务器中有一组由6块磁盘组建的RAID6磁盘阵列&#xff0c;操作系统层面运行MySQL数据库和存放一些其他类型文件。 服务器故障&#xff1a; 该服务器在工作过程中&#xff0c;raid6磁盘阵列中有两块磁盘先后离线&#xff0c;不知道是管理…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

创新性3D数据合成模型,微软推出EgoGen

随着AR、VR等设备的广泛应用,第一人称的应用开始增多。但在研发方面面临不同的挑战,例如&#xff0c;图像模糊、视觉混乱、遮挡更严重等&#xff0c;给视觉模型的训练带来重大挑战。 一方面,人工标注真实第一视角数据集&#xff0c;来培训深度学习模型的成本和难度都很高。另一…

Java 泛型

优质博文&#xff1a;IT-BLOG-CN 一、为什么要有泛型 【1】解决元素存储的安全性问题。 【2】解决获取数据元素时&#xff0c;需要类型强转的问题。 【3】可以统一数据类型&#xff0c;便于操作。 【4】将运行时的异常提前到了编译时&#xff0c;提高了效率。 【5】实现代码的…

Day20_网络编程(软件结构,网络编程三要素,UDP网络编程,TCP网络编程)

文章目录 Day20 网络编程学习目标1 软件结构2 网络编程三要素2.1 IP地址和域名1、IP地址2、域名3、InetAddress类 2.2 端口号2.3 网络通信协议1、OSI参考模型和TCP/IP参考模型2、UDP协议3、TCP协议 2.4 Socket编程 3 UDP网络编程3.1 DatagramSocket和DatagramPacket1、Datagram…

小世界网络:直径、分形、同配性

1.小世界网络特点 —— 网络直径接近于网络中节点数量的自然对数 2.小世界分形网络 —— 移除弱链接的小世界网络 3.同配性分析 —— Pearson相关系数、邻居相关度 在宏观层面上&#xff0c;关注平均度、度分布和聚类等全局结构特征的影响。更高的平均度被认为会导致更…

Zookeeper简介及选举机制

1.概述 Zookeeper是一个开源的&#xff0c;分布式的&#xff0c;为分布式框架&#xff08;如下图中的Hadoop和Hive&#xff09;提供协调服务的Apache项目。 工作机制&#xff1a;基于观察者设计模式的分布式服务管理框架&#xff0c;负责存储和管理数据&#xff0c;接受观察者…

[算法沉淀记录] 排序算法 —— 归并排序

排序算法 —— 归并排序 算法介绍 归并排序是一种分治算法&#xff0c;由约翰冯诺伊曼在1945年发明。它的工作原理是将未排序的列表划分为n个子列表&#xff0c;每个子列表包含一个元素(包含一个元素的列表被认为是有序的)&#xff0c;然后重复合并子列表以生成新的有序子列表…

ClickHouse 指南(三)最佳实践 -- 稀疏主索引

在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中&#xff0c;我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…

JavaScript原型继承与面向对象编程思想

原型继承与面向对象编程思想 在JavaScript中&#xff0c;原型(prototype)、构造函数(constructor)和实例对象(instance)是面向对象编程中的重要概念&#xff0c;并且它们之间存在着紧密的关系。 原型(prototype)&#xff1a;原型是JavaScript中对象之间关联的一种机制。每个Ja…

js使用import到本js文件中的函数时报错 Error [ERR_MODULE_NOT_FOUND]: Cannot find module

node:internal/process/esm_loader:97internalBinding(errors).triggerUncaughtException(^Error [ERR_MODULE_NOT_FOUND]: Cannot find module D:\桌面\Pagesizedetection\lib\screensize imported from D:\桌面\Pagesizedetection\index.js Did you mean to import ../lib/sc…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后&#xff0c;接下来就是存储数据了。数据的存储有多种多样&#xff0c;其中最简单的一种是将数据直接保存为文本文件&#xff0c;如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…