2022.10.19实训笔记

199 阅读6分钟

MSVC:微软的VC编译器 (PC端开发)

MingGW:跨平台开发。允许在GUN/Linux和Windows平台开发。MingGW需下载cmake自行编译。

GUN:类Unix操作系统,属自由软件集。

主要组件包括:GUN编译器集合,GUN C库,GUN文本编辑器等。

Qt常用数据类型

1)QChar QChar 类是 Qt 中用于表示一个字符的类,实现在 QtCore 共享库中。QChar 类内部用2个字节的Unicode编码来表示一个字符。

//char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析。 char gemfield = 'g'; //gemfield标记的这块内存的大小就是1个字节,信息就是01100111,8位。

char gemfield = '汉'; //gemfield标记的这块内存的大小依然是1个字节,存储的信息是:0xBA, //这是因为在windows系统中,汉字是以gbk编码(ANSI)存储的,“汉”这个字的编码是0xBABA,因为char只有1个字节,所以就把低字节存储过来。

//经过gemfield上面的介绍后,你已经理解了char这个内置类型的用法,也就理解了下面语句的输出了: char gemfield = 0x40; printf("gemfield’s value is %c", gemfield);

//依据Qt内部使用的unicode表和codec插件,gemfield就可以被成功解析为“汉”这个字。 QChar gemfield=0x6C49; //0x6C49是“汉”字的unicode编码

QChar c1 = 0x6C49; //Qchar c1 = '汉' 是不行的,因为在windows上 '汉'是GBK编码 
QString s = QString(c1); 
QString s1 = "中国"; 
qDebug() << s; 
qDebug() << s1; 
QChar c2 = 0x6c49; 
QString s2 = QString(c2); 
qDebug() << s2; //输出 "놉" "中国" "汉"

2)QString

QString ,存储 Unicode 编码的字符串,QString 类可以很方便的存储非 ASCII、非 Latin-1 字符。在 Qt 中存储一个 Unicode 字符是用 QChar 类,那么 QString 就是存储着一个个的 QChar。Unicode 编码格式是双字节存储一个字,所以 QString 类里面存储着一个个的 16-bit QChar 字符,每个 QChar 字符对应着一个 Unicode 4.0 字符。如果字符的编码大于65536时,用两个 QChar 存储这个字符。

Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

与C风格的字符串不同,QString中间是可以包含'/0'符号的,而length()函数则会返回整个字符串的长度,而不仅仅是从开始到'\0'的长度。

QString也重载的+和+=运算符。这两个运算符可以把两个字符串连接到一起。QString可以自动的对占用内存空间进行扩充。下面是这两个操作符的使用:

QString str = "User: " ;  
str += userName + "\n" ; 
QString的append()函数则提供了类似的操作,例如:

str = "User: " ;  
str.append(userName);  
str.append("\n" ); 
C语言中有printf()函数作为格式化输出,QString则提供了一个sprintf()函数实现了相同的功能:

str.sprintf("%s %.1f%%" , "perfect competition" , 100.0);

这句代码将输出:perfect competition 100.0%,同C语言的printf()一样。不过前面我们也见到了Qt提供的另一种格式化字符串输出的函数arg():

str = QString("%1 %2 (%3s-%4s)").arg("permissive").arg("society" ).arg(1950).arg(1970); 

这段代码中,%1, %2, %3, %4作为占位符,将被后面的arg()函数中的内容依次替换,比如%1将被替换成permissive,%2将被替换成society,%3将被替换成1950,%4将被替换曾1970,最后,这句代码输出为:

permissive society (1950s-1970s)

arg()函数比起sprintf()来是类型安全的,同时它也接受多种的数据类型作为参数,因此建议使用arg()函数而不是传统的sprintf()。

使用static函数number()可以把数字转换成字符串。例如:

QString str = QString::number(54.3); 

你也可以使用非static函数setNum()来实现相同的目的:

QString str;  
str.setNum(54.3); 

而一系列的to函数则可以将字符串转换成其他基本类型,例如toInt(), toDouble(), toLong()等。这些函数都接受一个bool指针作为参数,函数结束之后将根据是否转换成功设置为true或者false:


bool  ok;  
double  d = str.toDouble(&ok);  
if (ok)  
{  
    // do something...  
} else  {  
    // do something...  
} 

对于QString,Qt提供了很多操作函数,例如,使用mid()函数截取子串:

QString x  = "Nine pineapples" ;  
QString y  = x .mid(5, 4);            // y  == "pine"  
QString z  = x .mid(5);               // z  == "pineapples" 

mid()函数接受两个参数,第一个是起始位置,第二个是取串的长度。如果省略第二个参数,则会从起始位置截取到末尾。正如上面的例子显示的那样。

函数left()和right()类似,都接受一个int类型的参数n,都是对字符串进行截取。不同之处在于,left()函数从左侧截取n个字符,而right()从右侧开始截取。下面是left()的例子:

QString x = "Pineapple" ;  
QString y = x.left(4);      // y == "Pine"  
函数indexOf()返回字符串的位置,如:

QString x = "sticky question" ;  
QString y = "sti" ;  
x.indexOf(y);               // returns 0  
x.indexOf(y, 1);            // returns 10  
x.indexOf(y, 10);           // returns 10  
x.indexOf(y, 11);           // returns -1  
函数startsWith()和endsWith()可以检测字符串是不是以某个特定的串开始或结尾,例如:
if  (url.startsWith("http:" ) && url.endsWith(".png" ))  
{  
} 
这段代码等价于
if  (url.left(5) == "http:"  && url.right(4) == ".png" )  
{  
} 
不过,前者要比后者更加清楚简洁,并且性能也更快一些。

QString还提供了replace()函数供实现字符串的替换功能;trimmed()函数去除字符串两侧的空白字符(注意,空白字符包括空格、Tab以及换行符,而不仅仅是空格);toLower()和toUpper()函数会将字符串转换成小写大写字符串;remove()和insert()函数提供了删除和插入字符串的能力;simplified()函数可以将串中的所有连续的空白字符替换成一个,并且把两端的空白字符去除,例如" /t ”会返回一个空格" "。

3)QByteArray

常用构造函数: QByteArray()

QByteArray(const char *data, int size = -1)

QByteArray(int size, char ch)

实际工程中常用的是第二个构造函数,因为有了指针,所以我们知道了数据在内存中的开头位置,那么用 size 指定我们要多少数据即可。需要说明的是,默认 size 为负,那么 QByteArray 在构造的时候遇到第一个‘\0’空字符时停止。所以如果你要载入的数据中确实有‘\0’的话,需要手动指定 size,否则空字符后面的数据是不会被加载进来的

QByteArray array = "hello world" ; QString qstr = "hello world"; const char *sstr = "hello world"; //1.QByteArray 转 char * char *str = array.data(); qDebug() << str ; //2.char * 转 QByteArray QByteArray ba(str, strlen(str)); qDebug() << ba ; //3.char * 转 QString QString ds = QString(QLatin1String(sstr)); qDebug() << ds ; //4.QString 转 char * char *__sstr = NULL; QByteArray __array = qstr.toLatin1(); __sstr = __array.data(); qDebug() << __sstr ;