C++常用类

1、QString 字符串类

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

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

如果后续的学习或者工作中遇到编码出现中文乱码问题,请参考:

从此乱码是路人

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

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

// int -> QString
// 参数1:要转换的数字
// 参数2:进制
// 返回值:转换后的QString 对象
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:进制
// 返回值:转换后的结果,失败的话返回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 = "你好";
    qDebug()<<str;
    qDebug()<<str.size();
    //int->QString
    int a=255;
    qDebug()<<QString::number(a,10);
    qDebug()<<QString::number(a,8);
    qDebug()<<QString::number(a,16);
    qDebug()<<QString::number(a,2);
    //字符转int
    bool resule = false;
    str = "0";
    qDebug()<<str.toInt(&resule);//0 原始数据为0,需要传参验证是否转换成功
    qDebug() << resule;//true=1
    str = "22aa";
    qDebug()<<str.toInt(&resule);//0 转换失败
    qDebug() << resule;//false = 0
}
Dialog::~Dialog()
{
    delete ui;
}

不建议死记QString的API,因为数量较多且都有示例代码,只需要把常用函数的关键词记住即可:

2、容器类

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

2.1 顺序容器——QList类

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

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

2、在弹出的窗口中,选择“C++ class”,点击“选择”

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

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

自动添加构造函数

在对象头文件中添加成员变量,以下操作可以自动在头函数中声明get和set成员函数,在对象文件中初始化相关成员函数。

student.h中声明,student.cpp中实现dialog.cpp中调用,调用时注意添加自定义类的头函数,并表明作用域。赋值

删除插入对象:

三种对象遍历方式
for遍历

//遍历
    for(int i=0;i < lis.count();i++)
    {
        Student s = lis.at(i);
        qDebug()<<s.getId()<<s.getName()<<s.getMajor();
    }

c++迭代器遍历

//C++迭代器 遍历,本质还是for循环,用iter迭代器指针遍历,指针开始指向对象头,结束指向对象尾。
    for(QList<Student>::iterator iter = lis.begin();
    iter != lis.end();iter++)
    {
        Student s = *iter;
        qDebug()<<s.getId()<<s.getName()<<s.getMajor();
    }

JAVA迭代器遍历

//JAVA迭代器,参数为容器对象
    QListIterator<Student> iter(lis);
    while(iter.hasNext())//判断当前迭代器指针后面是否有可用元素
    {
        Student s = iter.next(); // 向后移动迭代器指针并取出元素
        qDebug()<<s.getId()<<s.getName()<<s.getMajor();
    }

2.2 关联容器——QMap类

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

插入操作:

删除操作:

查找/修改键值对:

取出元素:

直接遍历:

迭代器遍历:

JAVA迭代器遍历:(只读/读写)

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QMap>
#include <QDebug>class Dialog : public QDialog
{
    Q_OBJECTpublic:Dialog(QWidget *parent = 0);~Dialog();
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    QMap<QString,QString> map;//创建一个栈内存对象
    //插入数据
    map.insert("姓名","张三");
    map.insert("年龄","18");
    map.insert("地址","济南");
    map.insert("专业","总裁");
    map.insert("身高","185");
    map.insert("爱好","女");
    //如果容器中的元素支持qDebug输出,则容器本身也支持输出
    qDebug()<<map;
    //删除键值对,返回值为删除的键值对数量
    qDebug()<<map.remove("专业");//1
    qDebug() << map.remove("专业"); // 0,删除失败返回0    //查找键值对
    if(map.contains("专业"))
    {
        map["专业"]="富二代";
    }
    else
    {
        qDebug()<<"没有找到";
    }    if(map.contains("地址"))
    {
        map["地址"]="地球";
    }
    else
    {
        qDebug()<<"没有找到";
    }    qDebug()<<map;
    //取出元素,返回值为value,参数1:key,
    //参数2:如果没有找到对应的key就会输出第二个参数。
    qDebug()<<map.value("身高","没有找到");
    qDebug()<<map.value("专业","没有找到2");    //迭代器遍历
    for(QMap<QString,QString>::iterator iter = map.begin();
        iter != map.end();iter++)
    {
        //输出键与值
        qDebug()<<iter.key()<<iter.value();
    }
    //JAVA迭代器
    //读写迭代器:QMutableMapIterator<key,T>
    //只读迭代器:QMapIterator<key,T>
    QMapIterator<QString,QString> iter(map);
    while(iter.hasNext())
    {
        iter.next();
        //输出键与值
        qDebug()<<iter.key()<<iter.value();
    }}Dialog::~Dialog()
{}

3、Qt数据类型

3.1 跨平台数据类型

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

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

3.2 QVariant 统一变量类

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

dialog.cpp

#include "dialog.h"
Dialog::Dialog(QWidget *parent): QDialog(parent)
{qint64 a = 123;QVariant v(a);QString s = v.(); // 转换成字符串qDebug() << s ; // 字符串:"123"
    v = s;int b = v.toInt();   // 转换成intqDebug() << b ; // 整形:123
}
Dialog::~Dialog()
{}

3.3 QStringList字符串列表

几乎相当于QList<QString>

QList<QString> str={"AAAA","BBBB","CCCC"};

4、时间与日期处理

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

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

1)获取1970年1月1日00:00:00到现在的毫秒数函数

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

2)用处

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

  1. 时间戳的其他作用:

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

3)获取当前的日期时间对象

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

4)当拿到当前日期和时间的对象后,可以提取当前的日期和时间

// 参数为格式化输出年月日时分秒
QString QDateTime:: toString(const QString & format) const

秒:ss

大写月份;MMMM

星期:dddd

dialog.h

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

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;
}

开了两个Qt报错

5)其他的日期和时间相关的UI组件:

1、QTimeEdit

2、QDateEdit

  1. QDateTimeEdit

4、QCalendar

5、QTimer定时器类

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

使用定时器,需要包含头文件#include<QTimer>。定时器类继承自QObject。

QTimer的常用属性有:

  • interval : int

时间间隔,单位毫秒

  • singleShot : bool

是否是一次性

  • active : const bool

当前定时器的运行状态QLCDNumber 组件

使用这个组件,显示出11:31:30 这样的时间

定时器常用函数:

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

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

// 启动定时器,如果定时器已经存在,则会重启
void QTimer:: start()[slot]

// 定时器触发时,发送的信号
void QTimer:: timeout()[signal]

// 停止定时器
void QTimer:: stop()

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->setInterval(1000);// 设置周期循环
    timer->setSingleShot(false);// 信号槽连接,连接要在定时器启动之前connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));// 启动定时器
    timer->start();
}Dialog::~Dialog()
{if(timer->isActive())   // 如果正在运行,则关闭{
        timer->stop();}delete ui;delete timer;
}void Dialog::timeoutSlot()
{
    QString str = QDateTime::currentDateTime().toString("hh:mm:ss");
    ui->lcdNumber->display(str);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627928.shtml

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

相关文章

PointMixer: MLP-Mixer for Point Cloud Understanding

Abstract MLP-Mixer 最近崭露头角,成为对抗CNNs和Transformer领域的新挑战者。尽管相比Transformer更为简单,但通道混合MLPs和令牌混合MLPs的概念在图像识别任务中取得了显著的性能。与图像不同,点云本质上是稀疏、无序和不规则的,这限制了直接将MLP-Mixer用于点云理解。为…

i18n多国语言Internationalization的实现

i18n 是"Internationalization”的缩写&#xff0c;这个术语来源于英文单词中首尾字母“”和“n”以及中间的字符数(共计18个字符) 当我们需要开发不同语言版本时&#xff0c;就可以使用i18n多国语言的一个操作处理&#xff0c;i18n主要实现那一方面的内容呢&#xff1f;…

项目压测优化实践思路

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

日本樱岛火山喷发遥感卫星影像监测

日本樱岛火山喷发监测 当地时间2024年1月9日15时许&#xff0c;位于日本九州地区鹿儿岛县的樱岛南岳山顶火山口&#xff0c;开始喷发&#xff0c;火山烟雾从火山口上升至空中1200米左右。目前&#xff0c;日本气象厅将樱岛的火山警戒级别维持在3级&#xff0c;限制民众入山。 火…

HCS私有云简介

1、HCS简介和发展史 华为云产品&#xff1a;私有云和公有云&#xff0c;现在的私有云已经和公有云越来越像了FusionSphere是华为的一个品牌2016年&#xff0c;在5.0版本的时候&#xff0c;华为Openstack叫FusionSphere Openstack 5.0&#xff0c;底层用的是suse操作系统&#…

BitLocker 驱动器加密

BitLocker 简介 BitLocker 驱动器加密是一项由微软开发并集成在Windows操作系统中的数据保护功能&#xff0c;其主要作用是通过加密存储在硬盘驱动器上的数据来增强信息安全。具体来说&#xff1a; 数据安全&#xff1a;BitLocker可以对整个操作系统卷&#xff08;包括系统分区…

开源图床Lychee本地如何部署并结合内网穿透工具实现远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

酒店订房小程序源码系统:帮您打造类似美团的酒店模式的小程序 带完整的安装部署教程

随着移动互联网的快速发展&#xff0c;小程序已经成为一种新型的应用形态&#xff0c;为各大行业提供了更加便捷的服务。其中&#xff0c;酒店预订小程序作为一种方便快捷的预订方式&#xff0c;备受用户青睐。小编给大家分享一款酒店订房小程序源码系统&#xff0c;旨在帮助您…

中霖教育:中级会计师报名条件是什么?

一、学历要求 报考中级会计师的考生需要具备大专及以上学历&#xff0c;如果不满足学历要求是无法报考的。 二、工作经验要求 报考中级会计师的考生需要具备一定的工作经验。根据规定&#xff0c;不同的学历对从业年限要求不同&#xff0c;主要有以下几种情况&#xff1a; …

多租户体系实现

文章目录 核心思路方案选择设计考量安全性扩展性通用性易用性 具体实现租户信息透传透传变量名命名规范应用内透传应用间透传 数据层租户隔离MySQL存储方案&#xff1a;多租户Mybatis插件Mybatis插件特点使用多租户Mybatis插件的优势参考文档 应用场景 经过工作中的一处场景启发…

机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章

date: 2024/01/08 这个网站用可视化的方式讲解概率和统计基础知识,很多内容还是可交互的,非常生动形象。 大家好,欢迎收看第五期机器学习周刊 本期介绍7个内容,涉及Python、概率统计、机器学习、大模型等,目录如下: 一个离谱的Python库看见概率,看见统计2024机器学习最…

U盘提示未格式化解决方法超级简单

U盘提示未格式化是常见故障&#xff0c;主要原因有文件系统损坏、固件问题、物理故障等。解决方法包括格式化U盘、更新固件、恢复数据等&#xff0c;具体操作需根据故障原因选择。如无法解决&#xff0c;建议联系专业维修人员处理。 U盘提示未格式化解决方法超级简单 当U盘提示…

使用scipy处理图片——滚动图片

大纲 常规模式constant和grid-constant 交换模式wrap和grid-wrap 镜像reflect、mirror和grid-mirror 最近值nearest 代码 在《使用numpy处理图片——滚动图片》一文中&#xff0c;我们介绍了numpy的roll方法&#xff0c;它只能让超出区域的元素回到被移动的区域中&#xff0c;如…

置位复位寄存器的某一位(多工位多工站渗透线控制应用)

这里的置位复位特定寄存器位功能块可以应用在渗透线控制应用上,我们可以根据小车当前所在位置,对相关工作槽里的标志位进行置位复位等操作(某个槽有产品,某个槽没有产品等)。 下面我们看下对应的控制要求 1、置位复位特定的位 2、置位复位寄存器中的某一位 3、置位bit8 4…

【书生·浦语】大模型实战营——第五次课程作业

基础作业——使用LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署InternLM-Chat-7B模型&#xff0c;生成300字的小故事 环境准备 除了安装所需依赖之后&#xff0c;重要的是进行模型转化&#xff08;转换成TurboMind格式&#xff09;&#xff0c;这里需要注意转化命…

NFS概念与应用

一、NFS的概念 NFS&#xff08;Network File System 网络文件服务&#xff09; 文件系统&#xff08;软件&#xff09;文件的权限&#xff1b; NFS 是一种基于 TCP/IP 传输的网络文件系统协议&#xff0c;最初由 Sun 公司开发&#xff1b; 通过使用 NFS 协议&#xff0c;客户…

人工智能 | 生成式 AI 如何重塑开发流程和开发工具?

生成式 AI 如何重塑开发流程和开发工具&#xff1f; 生成式人工智能&#xff08;Generative Artificial Intelligence&#xff0c;GAI&#xff09;是一种基于大规模数据训练学习&#xff0c;从而生成新的原创内容的人工智能。生成式人工智能可以生成各种形式的数据&#xff0c…

鸿蒙开发工程师会不会有很好的就业前景?

一&#xff0c;鸿蒙带动IT开发和应用整体结构的变革 1月11日&#xff0c;以鸿蒙为首的华为概念股大幅走强&#xff0c;创业板创识科技拉升封板&#xff0c;传智教育、智度股份、高新发展、立达信、吉大正元等多股涨停&#xff0c;华亚电子、九联科技、软通动力、辰奕智能、芯海…

挂载mount、卸载umount,和rpm安装包

1.创建一个挂载目录dvd 2.把dev/cdrom 挂载到dvd 3.查看 4.挂载的格式 卸载挂载点 dvd 重新挂载到nsd30 rpm安装包的安装位置 可执行命令&#xff1a;一般安装到/usr/bin下 服务器程序&#xff0c;管理工具&#xff1a;一般安装到sbin下 配置文件&#xff1a;一般安装到etc下…

内存四区图练习

带着白卡去旅行 绘制图中三种情况的内存四区图 一个实参 一个形参 取地址 通过指针修改变量 返回 多级指针的训练 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h> #include<math.h>int getMem(char***p3,…