基本数据类型
基本数据类型是QT程序运行的基础,了解良好的基础才是以后高楼大夏的基石;
QT基本数据类型定义在#include <QtGlobal> 中,QT基本数据类型有
typedef signed char qint8; /* 8 bit signed */
typedef unsigned char quint8; /* 8 bit unsigned */
typedef short qint16; /* 16 bit signed */
typedef unsigned short quint16; /* 16 bit unsigned */
typedef int qint32; /* 32 bit signed */
typedef unsigned int quint32; /* 32 bit unsigned */
typedef long long qint64; /* 64 bit signed */
typedef unsigned long long quint64; /* 64 bit unsigned */
typedef qint64 qlonglong;
typedef quint64 qulonglong;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef double qreal;
如上图所示,是笔者在头文件中找到定义情况,一目了然,QT比较倾向使用数字表示出该数据类型的位数;比如char是一字节,8位的数据类型,那么在QT中基本是qint8来表示;以此类推,如果使用qint32,大家应该知道该数据类型是int
下面给大家介绍更高端的数据类型:
QString
QString类提供了一个Unicode 字符串,内部存储了一组QChar,在后台中,QString使用隐式共享来减少内存使用和避免不必要的数据复制。
1、隐式复制
又被称为写时复制,使用隐式共享类作为参数传递是既安全又有效的,因为只有一个指向该数据的指针被传递了,只有当函数向它写入时才会复制该数据
2、编辑操作
QString中包含了很多可以操作的内容,大家可以参考之下的内容:
qDebug()<<QObject::tr("以下是编辑字符串操作:")<<endl;
QString str = "hello";
qDebug()<<tr("字符串的大小:")<<str.size();
str[0] = QChar('H');
qDebug()<<tr("字符串:")<<str<<" "<<tr("长度")<<str.size();
str.append("QT");
str.replace(1,2,"i");
str.insert(1,"my");
qDebug()<<tr("字符串:")<<str;
QString str1 = " WPd \r \t \v wpfddd \n";
QString str2 = str1.trimmed();
qDebug()<<tr("两侧输出清除空格的字符串:")<<str2;
QString str3 = str1.simplified();
qDebug()<<tr("除去多余的空白字符为空格:")<<str3;
QString str4 ="hi,mynt,opt";
QStringList list =str4.split(",",QString::SkipEmptyParts);
qDebug()<<tr("输出拆分之后的list")<<list;
str4 =list.join(" ");
qDebug()<<tr("输出hebing之后的lstr")<<str4;
qDebug()<<tr("输出hebing之后的str是否为空")<<str4.isEmpty();
3、查询操作
qDebug()<<tr("输出str右边三位:")<< str4.right(3);
qDebug()<<tr("输出str左边两位")<<str4.left(2);
qDebug()<<tr("输出str从第二个字符以后i三个字符")<<str4.mid(2,3);
qDebug()<<tr("输出str某字符串的位置:")<< str4.indexOf("opt");
qDebug()<<tr("输出str某字符串的2位置:")<< str4.at(2);
qDebug()<<tr("输出str某o字符串的个数:")<< str4.count('t');
qDebug()<<tr("输出str开头:")<< str4.startsWith('h');
qDebug()<<tr("输出str结尾:")<< str4.endsWith('t');
qDebug()<<tr("输出str包含:")<< str4.contains("opt");
4、转换操作
QString name ="yafei";
int age =17;
QString str5 = QString("name is %1,age is %2").arg(name).arg(age);
qDebug()<<tr("输出str5名称:")<< str5;
qreal value = 123.456;
QString str6 = QString("number:%1").arg(value,0,'f',1);
qDebug()<<tr("输出str6名称:")<< str6;
QByteArray
在Qt中 QByteArray
可以看做是C语言中 char*
的升级版本。我们在使用这种类型的时候可通过这个类的构造函数申请一块动态内存 自己开辟一个内存空间,用于存储我们需要处理的字符串数据,通过这个类进行管理。
1、构造函数
// 构造空对象, 里边没有任何数据
QByteArray::QByteArray();
// 将data中的size个字符进行构造, 得到一个字节数组对象
// 如果 size==-1 函数内部自动计算字符串长度, 计算方式为: strlen(data)
QByteArray::QByteArray(const char *data, int size = -1);
// 构造一个长度为size个字节, 并且每个字节值都为ch的字节数组
QByteArray::QByteArray(int size, char ch);
2、使用
#include<QByteArray>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//有参构造
//字节数组:没有编码放的是什么输出就是什么 而且一个字节一个字节的输出 一个中文三个字节
QByteArray name("乘风破浪");
//qDebug所有类型都支持输出 重载了左移运算符
qDebug()<<name;
//无参构造
QByteArray str;
//str<<"hello"; 不支持流操作
//重载了赋值运算符 可以直接赋值一个字符串
str = "hello";
qDebug()<<str;
char* str1 = "taye is man1";
QByteArray s(str1);
qDebug()<<s;
//指定长度 只要4个字符
QByteArray s(str1,4);
qDebug().noquote()<<s; //不带双引号的输出 访问成员
return a.exec();
}
"\xE4\xB9\x98\xE9\xA3\x8E\xE7\xA0\xB4\xE6\xB5\xAA"
"hello" //字母只占一个字节 所有的英文都是ascii编码
"taye is man1"
taye
char* str1 = "maye is man";
QByteArray s(str1);
//后面追加
s.append("ok");
s.push_back("ok");
//前面追加
s.prepend("you");
s.push_front("1");
qout<<s;
s.remove(1,3); //从第1个位置开始删,删除3个字符
s.chop(4); //删除尾部的4个字符
s.truncate(5); //从第5个位置开始 后面全部截断
s.clear(); //全部清空
QByteArray str("hello welcome learn Qt");
//查找字符串中是否有Qt子串
if(str.contains("Qt"))
{
qout<<"有Qt";
}
else
{
qout<<"没有Qt";
}
//是否以指定的字符串开始
if(str.startWith("he"))
{
qout<<"有 he";
}
//是否以指定的字符串结尾
if(str.endWith("C"))
{
qout<<"有C";
}
//字符的遍历
//1.迭代器 ch:变量 str:容器
for(auto ch: str) //C++11新标准 用前面的变量把后面的容器中的值一个个取出来给ch 就可以一个个输出 会自动判断是否结束
{
qout<<ch; //输出字符串才带"",输出字符不带""
}
for(auto it = str.begin();it!=str.end();it++)
{
qout<<*it; //auto == QByteArray::iterator 自动类型推断
}
//2.使用下标法 需要知道str的长度
for(int i=0;i<str.size();i++)
{
qout<<str[i];
}
//测试代码
//QByteArray -> char*
QByteArray str("str");
char* pstr = str.data(); //获取char*类型
//int... -> QByteArray
str.setNum(520); //10进制的520
qout<<str;
str.setNum(520,16); //16进制的520自动转换为10进制
qout<<str;
str.setNum(3.1415);
str.setNum(3.1415,'g',2);//默认格式是'g',精度设置为2[包含整数部分]
qout<<str;
str.setNum(314.15,'E');
qout<<str;
auto num = QByteArray::number(620); //返回QByteArray的对象
qout<<num;
/*输出*/
"520" --->字符串
"208"
"3.1415"
"3.1"
"3.141500E+02" 3.1415*10^2
QVariant
QVariant(变体数据类型)这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。
QVariant 这个类型充当着最常见的数据类型的联合。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如int、float等。
联合:赋值一个int,通过 char 读,能够读到一个字符。
重载了很多不同的类型
//测试代码
#include<QVariant>
int main(int argc, char *argv[])
{
QCoreApplication a(argc,argv);
//存入数据 1.通过构造函数存储数据 2.通过setValue()存储数据
QVariant var(125);
QVariant var1("hello");
var1.setValue(9.62);
//取出数据
qDebug()<<var<<var1;
qDebug()<<var.toInt()<<var1.toString(); //将QVariant对象转换为实际的数据类型
qDebug()<<var.value<int>()<<var1.value<QString>();//直接转会报错 不知道要转换为什么类型的值 需要显式指定模板
qDebug()<<var.type()<<var.typeName(); //判断 QVariant中封装的实际数据类型
return a.exec();
}
/*输出*/
QVariant(QString,"hello") //字符串默认QString类型
QVariant(int,125) QVariant(double,9.62) //标明是什么类型的 值是多少
125 "9.62"
125 "9.62"
QVariant::int int //类型 类型名