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 ;