zoukankan      html  css  js  c++  java
  • QString

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/275360

    这段时间回家,一直没有来得及写,今天才发现博客的编辑器有了新版。还是先来试试新版编辑器的功能吧!

    今天要说的是QString。之所以把QString单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的。

    每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构。C++语言提供了两种字符串的实现:C 风格的字符串,以'‘结尾;std::string,即标准模版库中的类。Qt则提供了自己的字符串实现:QString。QString以16位 Uniode进行编码。我们平常用的ASCII等一些编码集都作为Unicode编码的子集提供。关于编码的问题,我们会到以后的时候再详细说明。

    在使用QString的时候,我们不需要担心内存分配以及关于''结尾的这些注意事项。QString会把这些问题解决。通常,你可以把 QString看作是一个QChar的向量。另外,与C风格的字符串不同,QString中间是可以包含''符号的,而length()函数则会返回 整个字符串的长度,而不仅仅是从开始到''的长度。

    同Java的String类类似,QString也重载的+和+=运算符。这两个运算符可以把两个字符串连接到一起,正像Java里面的操作一样。QString可以自动的对占用内存空间进行扩充,这种连接操作是恨迅速的。下面是这两个操作符的使用:

    1. QString str = "User: ";  
    2. str += userName + " "

    QString的append()函数则提供了类似的操作,例如:

    1. str = "User: ";  
    2. str.append(userName);  
    3. str.append(" "); 

    C语言中有printf()函数作为格式化输出,QString则提供了一个sprintf()函数实现了相同的功能:

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

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

    1. str = QString("%1 %2 (%3s-%4s)")  
    2.       .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()可以把数字转换成字符串。例如:

    1. QString str = QString::number(54.3); 

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

    1. QString str;  
    2. str.setNum(54.3); 

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

    1. bool ok;  
    2. double d = str.toDouble(&ok);  
    3. if(ok)  
    4. {  
    5.     // do something...  
    6. else {  
    7.     // do something...  

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

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

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

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

    1. QString x = "Pineapple";  
    2. QString y = x.left(4);      // y == "Pine" 

    函数indexOf()返回字符串的位置,如:

    1. QString x = "sticky question";  
    2. QString y = "sti";  
    3. x.indexOf(y);               // returns 0  
    4. x.indexOf(y, 1);            // returns 10  
    5. x.indexOf(y, 10);           // returns 10  
    6. x.indexOf(y, 11);           // returns -1 

    函数startsWith()和endsWith()可以检测字符串是不是以某个特定的串开始或结尾,例如:

    1. if (url.startsWith("http:") && url.endsWith(".png"))  
    2. {  

    这段代码等价于

    1. if (url.left(5) == "http:" && url.right(4) == ".png")  
    2. {  

    不过,前者要比后者更加清楚简洁,并且性能也更快一些。

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

    将const char *类型的C风格字符串转换成QString也是很常见的需求,简单来说,QString的+=即可完成这个功能:

    1. str += " (1870)"

    这里,我们将const char * 类型的字符串" (1870)"转换成为QString类型。如果需要显式的转换,可以使用QString的强制转换操作,或者是使用函数fromAscii()等。为了 将QString类型转成const char *字符串,需要进行两步操作,一是使用toAscii()获得一个QByteArray类型对象,然后调用它的data()或者constData()函 数,例如:

    1. printf("User: %s ", str.toAscii().data()); 

    为了方便使用,Qt提供了一个宏qPrintable(),这个宏等价于toAscii().constData(),例如:

    1. printf("User: %s ", qPrintable(str)); 

    我们调用QByteArray类上面的data()或者constData()函数,将获得QByteArray 内部的一个const char*类型的字符串,因此,我们不需要担心内存泄漏等的问题,Qt会替我们管理好内存。不过这也暗示我们,注意不要使用这个指针太长时间,因为如果 QByteArray被delete,那么这个指针也就成为野指针了。如果这个QByteArray对象没有被放在一个变量中,那么当语句结束 后,QbyteArray对象就会被delete,这个指针也就被delete 了。

    本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/275360

  • 相关阅读:
    手把手教你利用create-nuxt-app脚手架创建NuxtJS应用
    初识NuxtJS
    webpack打包Vue应用程序流程
    用选择器代替表格列的筛选功能
    Element-UI
    Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
    Sparse Principal Component Analysis via Rotation and Truncation
    Generalized Power Method for Sparse Principal Component Analysis
    Sparse Principal Component Analysis via Regularized Low Rank Matrix Approximation(Adjusted Variance)
    Truncated Power Method for Sparse Eigenvalue Problems
  • 原文地址:https://www.cnblogs.com/mmix2009/p/3538164.html
Copyright © 2011-2022 走看看