QT5模板库、工具类及控件

简介: 标准C++提供了两种字符串,一种是C语言风格的以“\0”字符结尾的字符数 组,另一种是字符串类string。而Qt字符串类QString功能更强大。

QT5模板库、工具类及控件


字符串类

标准C++提供了两种字符串,一种是C语言风格的以“\0”字符结尾的字符数 组,另一种是字符串类string。而Qt字符串类QString功能更强大。


QString类保存16位Unicode值,提供了丰富的操作、査询和转换等函数。 该类还进行了使用隐式共享(implicit sharing)、高效的内存分配策略等多方面的 优化。


操作字符串

(1) QString提供了一个二元的“ + ”操作符用于组合两个字符串,并提供了一 个"+=”操作符用于将一个字符串追加到另一个字符串的末尾,例如:

QString strl = "Welcome ";
strl=strl+ "to you! ";  //strl="Welcome to you!"
QString str2="Hello, ";
str2+="World!";         //str2=nHello,World! n

(2) QString::append()函数具有与“+=”操作符同样的功能,实现在一个字符 串的末尾追加另一个字符串,例如:

QString strl = "Welcome ";
QString str2 = "to ";
strl.append(str2);          //strl=Welcome to
strl. append ("you !") ;  //str 1= Wei come to you ! 

(3) 组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义符 和C++库中的函数sprintf()定义的一样。例如:

QString str;
str.sprintf("%s"," Welcome ");  //str="Welcome ”
str.sprintf("%s"," to you! ");  //str="to you!"
str.sprintf("%s %s"," Welcome nto you! ");//str=" Welcome to you!"

(4) Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函 数的重载可以处理很多的数据类型。此外,一些重载具有额外的参数对字段的宽度、 数字基数或者浮点数精度进行控制。通常,相对于函数QString::sprintf(),函数 QString::arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并 且允许改变"%n"参数的顺序。例如:

QString str;
str=QString(" %1 was bom in %2.") .arg("John") .arg(1982);//str="John was bom in 1982."

(5) QString也提供了一些其他组合字符串的方法,包括如下几种。


① insert()函数:在原字符串特定的位置插入另一个字符串;


② prepend()函数:在原字符串的开头插入另一个字符串;


③ replace()函数:用指定的字符串代替原字符串中的某些字符。


(6) 很多时候去掉一个字符串两端的空白(空白字符包括回车字符“\n”、换行字符“\r”、 制表符"\t"和空格字符“ ”等)非常有用,如获取用户输入的账号时。


① QString::trimmed()函数:移除字符串两端的空白字符;


② QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符 “,,代替字符串中出现的空白字符。


查询字符串数据

查询字符串数据有多种方式,具体如下。


(1) 函数QString::startsWith()判断一个字符串是否以某个字符串开头。此函数 具有两个参数,第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默 认情况下,是大小写敏感的),例如:

QString str="Welcome to you!";
str.startsWith("Welcome ", Qt::CaseSensitive) ; //返回 true;
str.startsWith( "you", Qt::CaseSensitive) ; //返回 false;

(2) 函数 QString::endsWith()类似于 QString::startsWith。,此函数判断一个字 符串是否以某个字符串结尾。


(3) 函数QString::contains()判断一个指定的字符串是否出现过,例如:

QString str=" Welcome to you!"
str.contains("Welcome", Qt::CaseSensitive) ;  //返回 true;

(4) 比较两个字符串也是经常使用的功能,QString提供了多种比较手段。


① operator<(const QString&):比较一个字符串是否小于另一个字符串,如果 是,则返回trueo


② operator<=(const QString&):比较一个字符串是否小于等于另一个字符串, 如果是,则返回trueo


③ operator==(const QString&):比较两个字符串是否相等,如果相等,则返回 trueo


④ operator>=(const QString&):比较一个字符串是否大于等于另一个字符串, 如果是,则返回true。


⑤ localeAwareCompare(const QString&,const QString&):静态函数,比较前后 两个字符串。如果前面字符串小于后面字符串,则返回负整数值;如果等于则返回 0;如果大于则返回正整数值。该函数的比较是基于本地(locale)字符集的,而且 是平台相关的。通常该函数用于向用户显示一个有序的字符串列表。


⑥ compare(const QString&,const QString&,Qt::CaseSensitivity):该函数可以指 定是否进行大小写的比较,而大小写的比较是完全基于字符的Unicode编码值的, 而且是非常快的,返回值类似于localeAwareCompare()函数。


字符串的转换

QString类提供了丰富的转换函数,可以将一个字符串转换为数值类型或者其 他的字符编码集。


(1) QString::tolnt()函数将字符串转换为整型数值,类似的函数还有toDouble()、 toFloat。、toLong。、toLongLong()等。下面举个例子说明其用法:

QString str="125";
bool ok;
int hex=str.tolnt(&ok,16) ; //ok=true,hex=293
int dec=str.tolnt(&ok, 10) ;  //ok=truez dec=125

(2) QString提供的字符编码集的转换函数将会返回一个const char类型版本 的 QByteArray,即构造函数 QByteArray(const char)构造的 QByteArray 对象。 QByteArray类具有一个字节数组,它既可以存储原始字节(raw bytes),也可以存 储传统的以“\0”结尾的8位的字符串。在Qt中,使用QByteArray比使用const char* 更方便,且QByteArray也支持隐式共享。转换函数有以下几种。


toAscii(): 返回一个ASCII编码的8位字符串。


toLatinl(): 返回一个Latin-1 (ISO8859-1)编码的8位字符串。


toUtf8(): 返回一个UTF-8编码的8位字符串(UTF-8是ASCII码的超集, 它支持整个Unicode字符集)。


toLocal8Bit(): 返回一个系统本地编码的8位字符串。


下面举例说明其用法:

QString str="Welcome to you! ";
QByteArray ba=str.toAscii();
qDebug()<<ba;
ba.append("Hello,World! ”);
qDebug()<<ba.data();

注意: NULL字符串和空(empty)字符串的区别。


一个NULL字符串就是使用QString的默认构造函数或者使用“(const char*)。” 作为参数的构造函数创建的QString字符串对象:而一个空字符串是一个大小为0 的字符串。一个NULL字符串一定是一个空字符串,而一个空字符串未必是一个 NULL字符串。例如:

QString().isNull(); //结果为true
QString()・isEmpty();//结果为true
QString("").isNull ();//结果为false
QString("").isEmpty();//结果为true


容器类

经常使用到的Qt容器类有QList、QLinkedList和QVector等。在开发一个较 高性能需求的应用程序时,程序员会比较关注这些容器类的运行效率,表2.1列岀 了 QList、QLinkedList和QVector容器的时间复杂度比较。


QList, QLinkedList和QVector容器的时间复杂度比较

容器类 查找 插入 头部添加 尾部添加
QList O(1) O(n) Amort.O(1) Amort.O(1)
QLinkedList O(n) O(1) O(1) O(1)
QVector O(1) O(n) O(n) Amort.O(1)

其中,“Amort.O(l)”表示,如果仅完成一次操作,可能会有0(n)行为;但是 如果完成多次操作(如n次),平均结果将会是0(1)。


QList 类、QLinkedList 类和 QVector 类

1.QList 类


QList是迄今为止最常用的容器类,它存储给定数据类型T的一列数值。继 承自 QList 类的子类有 QltemSelection、QQueue、QSignalSpy 及 QStringList 和 QTestEventList。


QList不仅提供了可以在列表进行追加的QList::append()和Qlist::prepend()函 数,还提供了在列表中间完成插入操作的函数QList::insert()。相对于任何其他的 Qt容器类,为了使可执行代码尽可能少,QList被高度优化。


QList维护了一个指针数组,该数组存储的指针指向QList存储的列表 项的内容。因此,QList提供了基于下标的快速访问。


对于不同的数据类型,QList釆取不同的存储策略,存储策略有以下几种。


(1) 如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节 数和指针类型占有的字节数相同),QList会将数值直接存储在它的数组中。


(2) 如果QList存储对象的指针,则该指针指向实际存储的对象。


下面举一个例子:

#include <QDebug>
int main(int argcA char *argv[])
{
    QList<QString> list;
    {
        QString str("This is a test string");
        list<<str;
    }
    qDebug () «list [ 0 ] << "How are you ! " ;
    return 0;
}


2.QLinkedList 类


QLinkedList是一个链式列表,它以非连续的内存块保存数据。


QLinkedList不能使用下标,只能使用迭代器访问它的数据项。与QList相 比,当对一个很大的列表进行插入操作时,QLinkedList具有更高的效率。


3.QVector 类


QVector在相邻的内存中存储给定数据类型T的一组数值。在一个QVector 的前部或者中间位置进行插入操作的速度是很慢的,这是因为这样的操作将导致内 存中的大量数据被移动,这是由QVector存储数据的方式决定的。


QVector既可以使用下标访问数据项,也可以使用迭代器访问数据项。继承 自 QVector 类的子类有 QPolygon、QPolygonF 和 QStack。


4.Java风格迭代器遍历容器


Java风格的迭代器是Qt 4新加入的一个功能。同STL风格的迭代器相比,它使用起来更简单方便,不过这也是以轻微的性能损耗为代价的。对于每一个容器类, Qt都提供了两种类型的Java风格迭代器数据类型,即只读访问和读写访问,其分 类见表2.2.


表2.2 Java风格迭代器数据类型的两种分类

容器类 只读迭代器类 读写迭代器类
QList,QQueue QListIterator QMutableListIterator
QLinkedList QLinkedListIterator QMutableLinkedListIterator
QVector,QStack QVectorIterator QMutableVectorIterator


5.STL风格迭代器遍历容器


对于每一个容器类,Qt都提供了两种类型的STL风格迭代器数据类型:一种 提供只读访问;另一种提供读写访问。由于只读类型的迭代器的运行速度要比读写迭代器的运行速度快,所以应尽可能地使用只读类型的迭代器。STL风格迭代器的 两种分类见表2.3。


表2.3 STL风格迭代器的两种分类

容器类 只读迭代器类 读写迭代器类
QList,QQueue QList::constiterator QList:: iterator
QLinkedList QLinkedList::constiterator QLinkedList:: iterator
Q Vector,Q Stack QVector::constiterator QVector::iterator


QMap 类和 QHash 类

QMap类和QHash类具有非常类似的功能,它们的差别仅在于:


• QHash具有比QMap更快的查找速度;


• QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据;


• QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数, 而QMap的键类型Key必须提供operator<()函数。


二者的时间复杂度比较见表2.4。


表2.4 QMap和QHash的时间复杂度比较

容器类 键查找 插 入



平 均 最坏 平 均 最坏
QMap O(log n) O(log n) O(log n) O(log n)
QHash Amort.O(1) O(n) Amort.O(1) O(n)

其中,“Amort.O(l)”表示,如果仅完成一次操作,则可能会有O(&)行为;如 果完成多次操作(如n次),则平均结果将是0(1)。


1.QMap 类


QMap<Key,T>提供了一个从类型为Key的键到类型为T的值的映射。


通常,QMap存储的数据形式是一个键对应一个值,并且按照键Key的次序存 储数据。为了能够支持一键多值的情况,QMap提供了 QMapvKey,T>::insertMulti() 和QMapvKey,T>:: values。函数。存储一键多值的数据时,也可以使用 QMultiMap<Key,T>容器,它继承自 QMap。


2.QHash 类


QHash<Key,T>具有与QMap几乎完全相同的API。QHash维护着一张哈希表 (Hash Table),哈希表的大小与QHash的数据项的数目相适应。


QHash以任意的顺序组织它的数据。当存储数据的顺序无关紧要时,建议使用 QHash作为存放数据的容器。QHash也可以存储一键多值形式的数据,它的子类 QMultiHash<Key,T>实现了一键多值的语义。


3.Java风格迭代器遍历容器


对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型:一种 提供只读访问;另一种提供读写访问。其分类见表2.5。


表2.5 Java风格迭代器的两种分类

容器类 只读迭代器类 读写迭代器类
QMap<Key,T>,QMultiMap<Key,T> QMapIterator<Key,T> QMutableMapIterator<Key,T>
QHash<Key,T>,QMultiHash<Key,T> QHashIterator<Key,T> QMutableHashIterator<Key,T>

5.STL风格迭代器遍历容器


对于每一个容器类,Qt都提供了两种类型的STL风格迭代器数据类型:一种 提供只读访问;另一种提供读写访问。其分类见表2.6。


表2.6 STL风格迭代器的两种分类

容器类 只读迭代器类 读写迭代器类
QMap<Key,T>,QMultiMap<Key,T> QMap<Key,T>::const iterator QMap<Key,T>:: iterator
QHash<Key,T>,QMultiHash<Key,T> QHash<Key,T>: :const iterator QHash<Key,T>:: iterator


算法及正则表达式

本节首先介绍Qt的<QtAIgorithms>和<QtGlobal>模块中提供的几种常用算法, 然后介绍基本的正则表达式。


1.Qt5常用算法


Qt的和模块提供了一些算法和函数。

tinclude <QDebug>
int main(int argcr char *argv[])
{
    double a=-19.3,b=9.7;
    double c=qAbs(a);       //c=19.3
    double max=qMax(b,c); //max=c=19.3
    int bn=qRound(b); //bn=10
    int cn=qRound(c); //cn=19
    qDebug()<<"a="<<a;
    qDebug()<<"b="<<b;
    qDebug()<<"c=qAbs(a)= "<<c;
    qDebug()<<"qMax(b,c)= "<<max; 
    qDebug()<<"bn=qRound(b)= "<<bn; 
    qDebug()<<"cn=qRound(c)= "<<cn;
    qSwap(bn,cn);
    qDebug()<<"qSwap(bn,cn):"<<"bn="<<bn<<" cn="<<cn;
    return 0;
}

2.基本的正则表达式


使用正则表达式可以方便地完成处理字符串的一些操作,如验证、査找、替换 和分割等。Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语 言,完全支持Unicodeo


正则表达式由表达式(expressions)、量词(quantifiers)和断言(assertions) 组成。


(1 )最简单的表达式是一个字符。如要表示字符集的表达式可以使用 “[AEIOU]”表示匹配所有的大写元音字母;使用”[ ^AEIOU] ”则表示匹配所有非 元音字母,即辅音字母;连续的字符集可以使用表达式如“[a-z]”,表示匹配所有 小写英文字母。


(2)量词说明表达式出现的次数,如“x[l,2]”表示“x”可以至少有一个,至多两个。 在计算机语言中,标识符通常要求以字母或下画线开头,后面可以是字母、数 字和下画线。满足条件的标识符表示为:


"[A-Za-z_]+[A-Za-z_0-9]* "


类似的正则表达式的量词见表2.8。


表2.8正则表达式的量词

量词 含 义 量 词 含 义
E? 匹配0次或1次 E[n,] 至少匹配n
E+ 匹配1次或多次 E[",m] 最多匹配m
E* 匹配0次或多次 E[n,m] 至少匹配n次,最多匹配m
E[n] 匹配n


(3) “^”、“$”、”\b”都是正则表达式的断言,正则表达式的断言见表2.9。


表2.9 正则表达式的断言

符 号 含 义 符 号 含 义
A 表示在字符串开头进行匹配 \B 非单词边界
$ 表示在字符串结尾进行匹配 (?=E) 表示表达式后紧随E才匹配
\b 单词边界 (?!E) 表示表达式后不跟随E才匹配


控件

本次只做介绍,详细内容后续会做详细讲解


1.按钮组(Buttons)

7e7609f053cb4458879d84f66267a251.png

按钮组(Buttons)中各个按钮的名称依次解释如下。


• Push Button:按钮。


• Tool Button:工具按钮。


• Radio Button:单选按钮。


• Check Box:复选框。


• Command Link Button:命令链接按钮。


• Button Box:按钮盒。


2.输入组(Input Widgets)

115f1193091f4e58b14fe83a33a408ef.png

组中各个控件的名称依次解释如下。


• Combo Box:组合框。


• Font Combo Box:字体组合框。


• Line Edit:行编辑。


• Text Edit:文本编辑。


• Plain Text Edit:纯文本编辑。


• Spin Box:数字显示框(自旋盒)。


• Double Spin Box:双自旋盒**。**


• Time Edit:时间编辑。


• Date Edit:日期编辑。


• Date/Time Edit:日期/时间编辑。


• Dial:拨号。


• Horizontal Scroll Bar:横向滚动条。


• Vertical Scroll Bar:垂直滚动条。


• Horizontal Slider:横向滑块。


• Vertical Slider:垂直滑块。


• Key Sequence Edit:键序列编辑


3.显示控件组(Display Widgets )

b9585d87e0ac499aba268ad34fd4ec74.png

• Label:标签。


• Text Browser:文本浏览器。


• Graphics View:图形视图。


• Calendar:日历。


• LCD Number:液晶数字。


• Progress Bar:进度条。


• Horizontal Line:水平线。


• Vertical Line:垂直线。


4.容器组(Containers )

29447f2605b14cbeb8736687af6a912b.png

容器组(Containers)中各个控件的名称依次解释如下。


• Group Box:组框。


• Scroll Area:滚动区域。


• Tool Box:工具箱。


• Tab Widget:标签小部件。


• Stacked Widget:堆叠部件。


• Frame:帧。


• Widget:小部件。


• MdiArea: MDI 区域。


• Dock Widget:停靠窗体部件。


• QAxWidget:封装 Flash 的 ActiveX 控件。


5.项目视图组(Item Views )


表 2.10 QTableView 与 QTableWidget 的具体区别

区别点 QTableView QTableWidget
继承关系 QTableWidget 继承自 QTableView
使用数据模型setMode I 可以使用setModel设置数据模型 setModel是私有函数,不能使用该 函数设置数据模型
显示复选框setCheckState 没有函数实现复选框 QTableWidgetitem 类中的 setCheckState(Qt::Checked)可以设置复选框
与 QSqlTableModel 绑定 QTableView 能够与 QSqlTableModel绑定 QTableWidget 不能与 QSqlTableModel 绑定


6.项目控件组(Item Widgets )


项目控件组(Item Widgets)


项目控件组(Item Widgets)中各个控件的名称依次解释如下。


List Widget: 清单控件。


Tree Widget: 树形控件。

目录
相关文章
|
25天前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
29 2
|
3月前
Qt提升控件类为自定义类
Qt提升控件类为自定义类
|
3月前
|
编译器
QT creator开发环境下 界面更改后运行程序不能实时更新或者在源文件添加该控件后无法编译的问题
在使用QT Creator开发界面的过程中,偶尔会出现添加控件后,运行程序后,界面控件无法更新的情况,或者在源文件使用该控件却出现无法编译的情况,使用QT Creator 4.8.2也会出现这个情况,也不知道这种情况会不会在以后有所改善。
67 0
|
17天前
|
开发框架 数据可视化 前端开发
【Qt 学习笔记】Qt控件概述
【Qt 学习笔记】Qt控件概述
21 0
|
17天前
|
图形学 Python 容器
【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)
【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)
35 0
|
25天前
|
编解码
qt中使用dll库的方法
qt中使用dll库的方法
15 2
|
25天前
|
存储
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
|
1月前
|
算法 API C++
Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景
Qt框架与STL库之间的巅峰对决:差异、优缺点及适用场景
129 0
|
2月前
|
容器
QT基础入门——界面布局和常用控件(四)
QT基础入门——界面布局和常用控件(四)
38 0
QT基础入门——界面布局和常用控件(四)
|
3月前
|
C++
QT 重写控件(QPushButton为例)实现背景图片的切换和鼠标样式切换
一般在QT开发中,使用setCursor()给控件设置鼠标的样式效果(一般是手型和箭头的切换),一般情况下,这个函数也是起作用的,但是一旦调用了全局QApplication::setOverrideCursor()设置鼠标效果后,在使用setCursor给控件设置鼠标样式就不起效果了,这是QT的机制
75 0

热门文章

最新文章

推荐镜像

更多