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

时间:2024-03-29 08:15:24

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

相关文章