QT常见数据类型和类的使用

 qDebug

//基本打印
qDebug() << "Hello" << 123;

//类似printf的打印
    int num = 20;
    char str[20]="hello world";
    qDebug("如果只写在括号里,是不需要QDebug头文件的 %d %s", num, str);

//打印十六进制数组
#define HexPrint(packet, len)\
do{\
    QByteArray data((const char*)packet, len); \
    QString hexString; \
    for (int i = 0; i < data.size(); i++) { \
        hexString += QString("%1 ").arg((quint8)data.at(i), 2, 16, QChar('0')); \
    } \
    qDebug() << hexString; \
}while(0);

//调用
    unsigned char packet[] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
    HexPrint(packet, sizeof(packet));

//其它
    uint8_t cArray[] = {1, 2, 3, 4, 5};
    qDebug()<<QByteArray((char*)cArray, sizeof(cArray));//"\x01\x02\x03\x04\x05"

    QList<int> list = {1, 2, 3, 4, 5};
    qDebug() << "QList:" << list;//QList: (1, 2, 3, 4, 5)

    QByteArray ba;
    ba.resize(5);
    ba[0] = 0x3c;
    ba[1] = 0xb8;
    ba[2] = 0x64;
    ba[3] = 0x18;
    ba[4] = 0xca;
    qDebug()<<"QByteArray"<<ba;//QByteArray "<\xB8""d\x18\xCA"

QByteArray

QByteArray 是一个Qt框架中的类,它是一个可变长的字节数组,可以用于存储任意类型的数据,包括二进制数据和文本数据

// 创建数组
QByteArray byteArray; // 空的字节数组
QByteArray byteArray1("Hello world"); // 初始化为字符串
QByteArray byteArray2 = "Hello world"; // 等同于上面的初始化方式
QByteArray byteArray3(10, '\0'); // 创建一个长度为10的空字节数组

//访问 QByteArray 中的数据:
char *data = byteArray.data(); // 获取字节数组的指针
int size = byteArray.size(); // 获取字节数组的长度
char byte = byteArray.at(0); // 获取字节数组中指定位置的字节

//将 QByteArray 转换为 QString
QByteArray bytes("hello world");
// 方法1
QString str = QString::fromUtf8(byteArray); //将字节数组转换为UTF-8编码的字符串
// 方法2
QString string = bytes;
// 方法3
QString string;
string.prepend(bytes);

//将 QString 转换为 QByteArray
QString str("hello");  
// 方法1
QByteArray bytes = str.toUtf8(); // 将字符串转换为UTF-8编码的字节数组
//方法2
QByteArray bytes = str.toLatin1();
//1
QByteArray ba("Hello");//大小为 5 的字节数组
//2
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
//3,对于只读访问,另一种语法是使用 at()
for (int i = 0; i < ba.size(); ++i) {
    if (ba.at(i) >= 'a' && ba.at(i) <= 'f')
        cout << "Found character in range [a-f]" << endl;
}
//4,修改字节数据的基本函数:append()、prepend()、insert()、replace() 和 remove()
QByteArray x("and");
x.prepend("rock ");         // x == "rock and"
x.append(" roll");          // x == "rock and roll"
x.replace(5, 3, "&");       // x == "rock & roll"

// 在QByteArray第0个字节后插入一个字符
byteArray.insert(1, 'B');
// 在QByteArray第1个字节后插入一个字符串
byteArray.insert(2, "123");
// 删除4~6字节
byteArray.remove(4, 3);
// 获取QByteArray的大小
int size = byteArray.size();
// 获取QByteArray的指针(只读)
const char* data = byteArray.constData();

QByteArray byteArray("Hello World");
QString str = QString::fromUtf8(byteArray);
// 获取QByteArray的data
const char* data = byteArray.data();
// 将QString转换为C字符串
QString str = "Hello World";
const char* c_str = str.toUtf8().data();

QString

1、Qt中的字符串类

(1)、采用Unicode编码(支持中文等)

(2)、使用隐式共享技术(集合了深拷贝浅拷贝)来节省内存和不必要的拷贝

(3)、跨平台使用,不需要考虑字符串的平台兼顾

2、Qstring VS string

(1)、Qstring 直接支持字符串和数字的互相转换

(2)、Qstring 直接支持字符串的比较大小

(3)、Qstring 直接支持不同字符编码间的相互转换

(4)、Qstring 直接支持std::string和std::wstring(宽)的相互转换

(5)、Qstring直接支持正则表达式的应用

(6)、Qstring在Qt库中几乎无所不在的,所有的Qt图形用户组件都依赖于Qstring

#include <QApplication>
#include <QDebug>
#include <QString>

void Sample_1()
{
    QString s = "add";
    
    s.append(" ");   //"add "
    s.append("Qt");  //"add Qt"
    s.prepend(" ");  //" add Qt"
    s.prepend("C++");//"C++ and Qt"
    
    qDebug() << s;
    
    s.replace("add", "&"); //"C++ & Qt"
    
    qDebug() << s;
}

void Sample_2()
{
    QString s = "";
    int index = 0;
    
    s.sprintf("%d. I'm %s, thank you!", 1, "SantaClaus"); //"1. I'm SantaClaus, thank you!"
    qDebug() << s;

    index = s.indexOf(",");
    //从索引0到index之间的字符子串
    s = s.mid(0, index);  //"1. I'm SantaClaus"
    qDebug() << s;
    
    index = s.indexOf(".");
    s = s.mid(index + 1,s.length()); //" I'm SantaClaus";
    s = s.trimmed();                 //"I'm SantaClaus";
    qDebug() << s;
    
    index = s.indexOf(" ");
    s = s.mid(index + 1, s.length()); //"SantaClaus"
    
    qDebug() << s;
}

void Sample_3(QString* a, int len)
{
    for(int i=0;i<len;i++)
    {
        for(int j=i+1; j<len; j++)
        {
            if( a[j] < a[i])
            {
                QString tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
}

int main(int,char**)
{
    qDebug() << "Sample_1:";   
    Sample_1();  
    qDebug() << endl;
    
    qDebug() << "Sample_2:";  
    Sample_2(); 
    qDebug() << endl;
    
    qDebug() << "Sample_3:";  
    QString company[5] =
    {
        QString("Oracle"),
        QString("Borland"),
        QString("Microsoft"),
        QString("IBM"),
        QString("Horizon Studio")      
    };
    
    Sample_3(company, 5);
    
    for(int i=0; i<5; i++)
    {
        qDebug() << company[i];
    }  

    return 0;
}

uint8_t*转QString 

//方案1
uint8_t num = 123;
uint8_t* ptr = &num;
QString str = QString::number(num);
QString str = QString::number(*ptr, 8);  // 八进制
QString str1 = QString::number(*ptr, 2); // 二进制
QString str2 = QString::number(*ptr, 16);

//方案2
uint8_t arr[] = {123, 45, 67, 89};
uint8_t* ptr = arr;
QByteArray ba;
for(int i = 0; i < sizeof(arr)/sizeof(uint8_t); i++)
{
    ba.append(static_cast<char>(ptr[i]));
}
QString str = ba.toHex();
QString str = QString(ba.toPercentEncoding());

 char*转QString

// 假设你有一个 char* 指针,指向以空字符'\0'结尾的字符序列
char* cStr = "Hello, World!";
 
// 方法1: 使用 QString 的构造函数
QString qStr1 = QString(cStr);
 
// 方法2: 使用 QString::fromUtf8,适用于UTF-8编码的字符串
QString qStr2 = QString::fromUtf8(cStr);
 
// 方法3: 使用 QString::fromLocal8Bit,适用于本地编码的字符串
QString qStr3 = QString::fromLocal8Bit(cStr);
 
// 方法4: 使用 QString::fromLatin1,适用于Latin1编码的字符串
QString qStr4 = QString::fromLatin1(cStr);
 
// 输出转换后的 QString
qDebug() << qStr1;

QByteArray 转QString

QByteArray byteArray = "Hello, world!";
QString string = QString(byteArray);

QString string = QString::fromUtf8(byteArray);

QString string = QString::fromLocal8Bit(byteArray);

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString string = codec->toUnicode(byteArray);

QString 转QByteArray 

QString str = "Hello, World!";
QByteArray ba = str.toUtf8();

QByteArray ba = str.toLocal8Bit();

QByteArray ba = str.toLatin1();

QString 转int和hex

QString str = "123";

bool ok;
int number = str.toInt(&ok,10);//转10进制
int number_hex = str.toInt(&ok,16);//十六进制
if (ok) {
    qDebug() << "转换成功,整数为:" << number;
} else {
   qDebug() << "转换失败";
}

 QString的arg方法

一:使用arg(str1, str2, str3)

//arg( )里的参数实现从1个到9个,也就是说最多只能有9个!方法如下

QString QString::arg(const QString & a1, const QString & a2,
const QString & a3, const QString & a4, const QString & a5,
const QString & a6, const QString & a7, const QString & a8, 
const QString & a9) const

//应用
QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").
            arg("1","2","3","4","5","6","7","8","9")
//输出:"1 2 3 4 5 6 7 8 9 %10 %11"

//解决上面输出问题:
QString str = QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").
            arg("1","2","3","4","w","6","7","8","9").arg("a","b");
//输出为: "1 2 3 4 5 6 7 8 9 a b"

 二.使用arg(str1).arg(str2).arg(str3)

QString str=QString("%1 %2 %3 %4").arg("A").arg("B").arg("C").arg("D");
//str=="A B C D"

 三. 使用arg(int, int, int)

QString QString::​arg(int a, int fieldWidth = 0, int base = 10, 
QChar fillChar = QLatin1Char( ' ' )) const
//其中第一个参数是要填充的数字,第二个参数为最小宽度,
//第三个参数为进制,第四个参数为当原始数字长度不足最小宽度时用于填充的字符。

//应用
uint32_t u32_value = 2;
QString("0b%1").arg(u32_value, 4, 2, QChar('0')) //得到0b0010,其中参数4为输出4位,2为二进制,位数填充'0'

str = QString("十进制 63 的十进制为 %1").arg(63, 0, 10);
//输出:"十进制 63 的十进制为 63"
str = QString("十进制 63 的十六进制为 %1").arg(63, 0, 16);
//输出:"十进制 63 的十六进制为 3f"
str = QString("%1 %L2 %L3")
            .arg(12345)
            .arg(1987654321)  //根据结果,可知道这个L的作用
            .arg(12345, 0, 8); //但使用这种方式时,L失效,这里%L3的L没有任何作用
//输出为:12345 1,987,654,321 30071

  指定字符串长度不够补空格

QString FillIn (QString str,int maxLen, QChar c)
{
    int len = str.length();
    if(len < maxLen)
    {
        for(int i =0 ; i < maxLen - len; i++)
            str +=  c;
    }
    str +=  "="; //返回的字符串以'='对齐
    return str;
};
//应用情况
    QString str1 = FillIn("mystring123",60,' ');
    QString str2 = FillIn("mystring123567",60,' ');
    QString str3 = FillIn("mystring12356789",60,' ');

    m_pReceiveDataBox->append(str1);
    m_pReceiveDataBox->append(str2);
    m_pReceiveDataBox->append(str3);

    uint32_t u32_value = 2;
    QString str4 = QString("%1 %2").arg(FillIn("Bit3-0:lvd_res_en",60,' '), QString("0b%1").arg(u32_value, 4, 2, QChar('0')));

    u32_value = 5;
    QString str5 =QString("%1 %2").arg(FillIn("Bit6-3:lvd_level ",60,' '), QString("0b%1").arg(u32_value, 3, 2, QChar('0')));
    m_pReceiveDataBox->append(str4);
    m_pReceiveDataBox->append(str5);

上述代码运行结果:

QVector

#include <QtCore/QCoreApplication>
#include <QVector>
#include <iostream>
using namespace std;
 
int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	QVector<int> vec;
	vec.push_back(9);
	vec.append(3);
	vec.push_back(7);
	vec.push_front(5);
	vec.push_front(2);
	vec.append(6);
	vec.insert(0, 11);
	vec.insert(0, 12);
	vec.insert(4, -1);
 
	//12 11 2 5 9 3 7 6
	for (int elem : vec)
	{
		cout << elem << " , ";
	}
	cout << endl;
 
	//删除元素
	cout << "QVector删除数据操作" << endl;
	vec.pop_back();
	vec.pop_front();
	vec.remove(2, 1);  //删除当前vec的第2个数据
	for (int elem : vec)
	{
		cout << elem << " , ";
	}
	cout << endl;
	//当前vec的元素:11 2 -1 9 3 7
	cout << "迭代器用法" << endl;
 
	//QVector<int>::iterator it;
	//for (it = vec.begin(); it != vec.end(); it++)
	for(auto it= vec.begin(); it != vec.end(); it++)
	{
		if (*it == -1)
		{
			vec.erase(it);  //删除掉-1
		}
 
		cout << *it << " ,";
	}
	cout << endl;
	vec.clear();
	cout << "清空后vec大小 = " << vec.size() << endl;
	return a.exec();
}
/*
   运行结果:

          12 , 11 , 2 , 5 , -1 , 9 , 3 , 7 , 6 ,
          QVector删除数据操作
          11 , 2 , -1 , 9 , 3 , 7 ,
          迭代器用法
          11 ,2 ,9 ,3 ,7 ,
          清空后vec大小 = 0
 */

QHash

//1、创建;这里以键int,值QString示例
QHash<int,QString> qhash;
//2、插入
     //方式一
     qhash[1] = "1";
     qhash[2] = "2";
     qhash[3] = "3";
     //方式二
     qhash.insert(4, “4”);// qhash.insert(4,"10);先前的值将被删除 
//3、取值
    //方式一   
    QString str1=qhash.value(1);//str1="1";
    //方式二
    QString str2=qhash[2];//str1="2";

//4、检索某个值是否在里面
    if(qhash.contains(9)){
        return false;
    }
    if(qhash.contains(1)){
        return true;
    }
//5、查找某个字并获取
    QString str;
    if(qhash.contains(1)){
        str=qhash.value(1);      
    }else{
        str=qhash.value(1,"wert");
        //如果哈希表中不存在指定键的元素,该函数使用第2个参数作为默认值
    }
    
//6、遍历 QHash 中存储的所有键值对
QHash<int,QString>::const_iterator it = qhash.constBegin();
while (it != qhash.constEnd()) {
    cout << it.key() << ": " << it.value() << Qt::endl;
    ++it;
}

//7、删除,下面两种都可以
    qhash.erase(it);//这里的it是迭代器哦
    qhash.remove(key);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

紧急声明!致歉

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 致歉 首先&#xff0c;给大家说声抱歉&#xff01; 最近mxxWechatBot的服务器一直不稳定&#xff0c;有很多原因&#xff0c; 比如说服务器到期了&#xff0c;讲服务器临时切换到家里&am…

【Review+预测】测试架构演进的曲折之路

文章目录 前言 一、“原始”阶段 二、“小打小闹”阶段 三、“小米加步枪”阶段 四、“摩托化部队”阶段 五、“骑兵连”阶段 六、“海军陆战队”阶段 七、“社区型组织”阶段 前言 近期公司的测试团队需要重新组织安排&#xff0c;本着谦虚谨慎的态度&#xff0c;我从…

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

测试开发工程师(QA)职业到底需要干些什么?part1:移动端QA

概述 移动端QA测试开发工作主要涉及对移动应用程序进行质量保证和测试的开发工作。以下是移动端QA测试开发人员的主要职责和工作内容&#xff1a; 测试计划和策略制定&#xff1a;参与制定移动应用程序的测试计划和策略&#xff0c;确定测试范围、测试目标和测试方法。考虑到…

牛客小白月赛89(A~C)

小白赛怎么这么难打&#xff0c;是什么小白&#xff0c;我的世界小白吗。 A. 伊甸之花 给你一个数组 a&#xff0c;问你是否找出一个 不等于 a 的数组 b&#xff0c;满足 其中数值都要在 [1,m] 的范围内 直接在 a 数组上修改&#xff0c;可以发现如果改了 a[1],a[2]&#xff…

Oh My Bug || PHPmyAdmin导入csv文件时,502报错

解决&#xff1a; 在宝塔面板文件配置中加入一下代码 location / { proxy_pass http://localhost:888; } location /backend-api { rewrite ^/backend-api(.*)$ $1 break; proxy_pass http://你的ip地址; }

DP:斐波那契数列模型

创作不易&#xff0c;感谢三连支持 &#xff01; 斐波那契数列用于一维探索的单峰函数之中&#xff0c;用于求解最优值的方法。其主要优势为&#xff0c;在第一次迭代的时候求解两个函数值&#xff0c;之后每次迭代只需求解一次 。 一、第N个泰波那契数 . - 力扣&#xff08;…

简介:iframe 沙箱+WebComponent 容器

前言 HTML 内联框架元素 (<iframe>) 表示嵌套的browsing context。它能够将另一个 HTML 页面嵌入到当前页面中。 每个嵌入的浏览上下文&#xff08;embedded browsing context&#xff09;都有自己的会话历史记录 (session history)和DOM 树。包含嵌入内容的浏览上下文称…

【史上最全面arduino esp32教程】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 欢迎阅读本篇文章&#xff0c;将为您介绍Arduino ESP32上的SPI通信协议。SPI&#xff08;Serial Peripheral Interface&#xff09;…

Matlab快捷键与函数

注释&#xff1a;注释对于代码的重要性我们就不做过多的解释了。不做注释的代码不是好代码。选中要注释的语句&#xff0c;按快捷键CtrlR,或者在命令行窗口上面的注释地方可以进行注释。当然也可以直接在语句前面“%”就可以&#xff08;注意&#xff1a;一定要用英文符号&…

Matlab与高光谱遥感:环境监测的新时代

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

Windows10安装SSH

Linux运维工具-ywtool 目录 1. 打开设置2. 应用3.管理可选功能4.添加功能5.安装OpenSSH服务器6.测试是否安装成功 1. 打开设置 windows桌面按下"win l"键调出"设置"2. 应用 点击"应用"3.管理可选功能 点击"管理可选功能"4.添加功能…

定制红酒:品质与口感,双重保障

在葡萄酒的世界里&#xff0c;云仓酒庄的洒派定制红酒以其卓着的品质和迷人的口感&#xff0c;成为了无数品鉴者的心头好。这款红酒&#xff0c;不仅是对品质的追求&#xff0c;更是对生活的热爱和品味的体现。 云仓酒庄深知品质是红酒的灵魂&#xff0c;因此对洒派定制红酒的品…

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…

【Linux】信号的处理{信号处理的时机/了解寄存器/内核态与用户态/信号操作函数}

文章目录 0.对于信号捕捉的理解1.信号处理的时机1.1 何时处理信号&#xff1f;1.2 内核态和用户态1.3 内核态和用户态的切换 2.了解寄存器3.信号捕捉的原理4.信号操作函数4.1sighandler_t signal(int signum, sighandler_t handler);4.2int sigaction(int signum, const struct…

网工内推 | 数通工程师,IE认证优先,五险一金,绩效奖

01 星网信通 招聘岗位&#xff1a;数通产品经理 职责描述&#xff1a; 1、售前技术支持&#xff1a;技术交流、产品选型报价、方案制作等工作&#xff1b; 2、招投标支持&#xff1a;项目招标参数撰写、标书质疑、应标文件技术部分撰写及资质文件归纳准备、现场讲标及技术澄清…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置&#xff08;模板页面还需要修改&#xff09; 总结 1 vmware exporter安装配置 …

快速将第三方私有协议视频源接入GB28181系统

一.管理平台与视频接入网关架构 视频监控中的各类视频源可能存在不同厂商&#xff0c;不同协议&#xff0c;不同版本的情况&#xff0c;那么如何将众多这样的视频源统一接入到标准的视频管理平台呢&#xff1f; 视跃的视频综合管理平台通过内置一个视频接入网关的模式&#xff…

虚拟机修改工具箱

虚拟机修改工具箱&#xff0c;内含各种虚拟机修改工具&#xff0c;过检测工具&#xff0c;显卡驱动等一系列虚拟机常用资源&#xff01; 上图 关注我&#xff0c;要下载地址&#xff01;

如何做时间管理?

前言 本篇是最近学习工作提效系列课程的第一篇&#xff0c;如何做时间管理&#xff1f;关于时间管理的内容老生常谈了&#xff0c;我自己之前也分享过针对时间管理的一些思考&#xff0c;比如 近期对「时间管理」的一些思考&#xff0c; 还有高效能人士的七个习惯的分享【读书…