不二如是 发表于 2016-10-27 15:25:15

123-#重磅-QString-【深度扫盲】

本帖最后由 不二如是 于 2016-10-27 16:43 编辑



来,再开始介绍前,先请你看下Qstring的官方文档、

感受下这个气势,就知道他有多牛x~

怎么说呢,他就像水和人的关系。

每个人都要喝,却不知道他有多么珍贵~

不扯远哈~

QString类提供了Unicode字符串。

好吧,我知道你要问不二:啥叫Unicode?

答:Unicode就是一种支持大部分文字系统的国际字符标准!

其实不管哪种编程语言:“Hello World”都会用到他。

并且在日常开发,QString无处不在,必须要知己知彼,深入的了解下哈{:10_278:}

不二从四个角度。

好好给你一件一件拨开,让你看到本质不过如此{:10_336:} ~

对了,这四个大标题,都是传送门,会把你领进我们四大当家头牌的闺房哈{:9_236:}


[*]隐式共享(Implicit Sharing)

QString存储了一串QChar,而QChar提供了一个16位的Unicode字符。

在后台运行中,QString使用隐式共享(impliccit sharing)来减少内存使用和避免不必要的数据拷贝

有助于减少存储16位字符串的内存开销。

一个共享类由一个 指向一个共享数据块的 指针和数据组成。

在共享数据块中包含了一个引用计数。

当一个共享对象被建立时,会设置引用计数为1,稍后程序会有演示哈~

当引用计数为0时,这个共享数据就会被销毁掉。

当处理共享对象时,有两种复制对象的方式:


看懂这个不二珍藏的gif,你就懂深和浅了{:10_336:}


[*]深拷贝(deep copy)

深拷贝意味着复制一个对象

代价非常昂贵,需要消耗很多内存和CPU资源。

当一个对象被修改时,必须要用深拷贝

[*]浅拷贝(shallow copy)

浅拷贝意味着复制一个引用(只是指向共享数据块的指针)

速度很快,因为他只需要设置一个指针和增加引用计数的值~

出现‘=’,例如,p2 = p1 就是一次浅拷贝。



共享的好处是程序不需要进行不必要的数据复制,可以减少数据的拷贝和使用更少的内存!

对象也容易被分配,或者作为参数被传递、返回。

隐式共享是在后台自动运行的,不必去关注他,但你一定要懂!

Qt主要的隐式共享有QByteArray、QCursor、QFont、QPixmap、QString、QUrl、QVariant和

所有的容器!


[*]编辑操作(Edit Operation)

QString提供了多个方便的函数来操作字符串

append()、prepend()分别实现了在字符串后面和前面添加字符串或者字符

replace()、insert()、remove()、trimmed()除去字符串两端空白字符。

simplified()不仅除去字符串两端的空白字符,还将字符串中间字符序列替换为一个空格

split()可以将一个字符串分割为多个字符串列表。

对于字符串是可以使用‘[ ]’来获取或者修改其中一个字符

‘+’组合两个字符。

null字符串和一个空字符串并不是完全一样。

一个null字符串是使用QString的默认构造函数或者在构造函数中传递了0来初始化的字符串。

而空字符串指大小为0的字符串。

null字符串是空字符串,但空字符串不一定是null字符串。

可以使用isEmpty()来判断哈~


[*]查询操作(Query Operation)

在QStrinh中还提供了rigth()、left()、mid()函数来提取一个字符串的最右面、左面、中间的含有多个字符串的子字符串。

indexOf()函数来获取一个字符串或者子字符串在该字符串中的位置。

at()函数获取一个指定位置的字符串。

at()比‘[ ]’要快很多,很简单不会使用深拷贝啦~

contains()判断该字符串是否包含一个指定的字符或者字符串。

count()来获得字符串一个字符或者子字符串出现的次数。

startsWith()和endsWidth()用来判断字符串是否是以一个字符或者字符串开始或者结束的,

‘>’'<='等进行两个字符串的比较。

当然了,compare()更可以用来比较字符串了!


[*]转换操作(.arg)



QString中toInt()、toDouble()等函数都是用来将字符串转换为整形或者double型数据。

当转换成功后,他们的第一个bool型参数会为true

使用静态函数number()可以将数值转换为字符串,但一定要指定转换为哪种进制。

toLower()、toUpper()分别返回字符串小写、大写形式的副本

arg()中的参数可以取代字符串中相应的‘%1’等标记。

在字符串可以使用的标记在1-99之间,arg()函数会从最小的数字开始对应。

QString(“%99,%5,%97”).arg("a").arg("b")

那么"a"会代替"%5","b"代替"%97","%99"则直接显示 。

arg()一种重载形式arg(const QString & a1,const QString & a2)

和str.arg(a1).arg(a2)是一样的~

QString类函数参数格式,在上面。

大概意思就是:


格式 含义
e 格式:[-]9,9e[+|-]999
E 格式:[-]9,9E[+|-]999
f 格式:[-]9,9
g 使用e或者f格式,选择其中最精简的
G 使用E或者f格式,选择其中最精简的



对于‘e’、‘E’、‘f’格式,精度precision表示小数点后面的位数

对于‘g’、‘G’格式,精度表示有效数字的最大位数。

arg()是一个非常有用的函数。

要在一个字符串中使用变量,那么使用arg()就是一种很好的选择!

qPrintable()函数,他不是QString中的函数,但可以使用这个函数,去掉最后输出的"引号"

toAscii()、toLation1()、toUtf8()、toLocal8Bit()等函数

都是使用一种编码将字符串转换为QByteArray()类型。

后面会介绍到QByteArray(),憋着急


流月飞星 发表于 2016-10-28 22:42:37

{:10_266:}{:10_266:}

不二如是 发表于 2016-10-29 08:47:37

流月飞星 发表于 2016-10-28 22:42


{:10_257:}

lili200238 发表于 2016-11-1 18:32:07

基础学些什么语言可以开始学QT呢?

不二如是 发表于 2016-11-1 21:27:55

lili200238 发表于 2016-11-1 18:32
基础学些什么语言可以开始学QT呢?

C++咯

lili200238 发表于 2016-11-1 22:26:32

不二如是 发表于 2016-11-1 21:27
C++咯

小甲鱼老师的“C++快速入门”快听完了,感觉完全没入门,怎么办吧???

{:7_119:}{:7_119:}{:7_119:}

不二如是 发表于 2016-11-2 08:29:59

lili200238 发表于 2016-11-1 22:26
小甲鱼老师的“C++快速入门”快听完了,感觉完全没入门,怎么办吧???

那就不要快速入门喽

慢慢把概念过一篇,最基础,虽然好多大牛很瞧不上
但谭浩强老师的C++ ,比较简单。。。

谦虚求学 发表于 2016-11-6 13:47:23

{:5_91:}

不二如是 发表于 2016-11-6 13:52:04

谦虚求学 发表于 2016-11-6 13:47


{:9_237:}

SylarPu 发表于 2018-2-5 15:01:03

支持楼主~~~ 我也正在学习PYQT5,但是找不到啥资源和案例,可以指条明路不{:10_250:}
页: [1]
查看完整版本: 123-#重磅-QString-【深度扫盲】