




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2章 Qt 5模板库、工具类及控件,字符串类,容器类,QVariant类,算法及正则表达式,控件,2.1 字符串类,2.1.1 操作字符串 字符串有如下几个操作符。 (1)QString提供了一个二元的“+”操作符用于组合两个字符串,并提供了一个“+=”操作符用于将一个字符串追加到另一个字符串的末尾,例如: QString str1 = Welcome ; str1=str1+to you! ; /str1= Welcome to you! QString str2=Hello, ; str2+=World! ; /str2=Hello,World! 其中,QString str1 = We
2、lcome 传递给QString一个const char*类型的ASCII字符串“Welcome”,它被解释为一个典型的以“0”结尾的C类型字符串。这将会导致调用QString构造函数,来初始化一个QString字符串。其构造函数原型为: QT_ASCII_CAST_WARN_CONSTRUCTOR QString:QString(const char* str),2.1.1 操作字符串,(2)QString:append()函数具有与“+=”操作符同样的功能,实现在一个字符串的末尾追加另一个字符串,例如: QString str1 = Welcome ; QString str2 = to
3、; str1.append(str2); /str1= Welcome to str1.append(you! ); /str1=Welcome 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 , to you! ); /str= Welcome t
4、o you! ,2.1.1 操作字符串,(4)Qt还提供了另一种方便的字符串组合方式,使用QString:arg()函数,此函数的重载可以处理很多的数据类型。此外,一些重载具有额外的参数对字段的宽度、数字基数或者浮点数精度进行控制。通常,相对于函数QString:sprintf(),函数QString:arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并且允许改变%n参数的顺序。例如: QString str; str=QString(%1 was born in %2.).arg(John).arg(1982);/str=John was born in 1982.“
5、 (5)QString也提供了一些其他组合字符串的方法,包括如下几种。 insert()函数:在原字符串特定的位置插入另一个字符串。 prepend()函数:在原字符串的开头插入另一个字符串。 replace()函数:用指定的字符串代替原字符串中的某些字符。,2.1.1 操作字符串,(6)很多时候,去掉一个字符串两端的空白(空白字符包括回车字符“n”、换行字符“r”、制表符“t”和空格字符“ ”等)非常有用,如获取用户输入的账号时。 QString:trimmed()函数:移除字符串两端的空白字符。 QString:simplified()函数:移除字符串两端的空白字符,使用单个空格字符“ ”
6、代替字符串中出现的空白字符。 例如: QString str= Welcome t to n you! ; str=str.trimmed(); /str= Welcome t to n you! ,2.1.2 查询字符串数据,(1)函数QString:startsWith()判断一个字符串是否以某个字符串开头。此函数具有两个参数。第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏感的),例如: QString str=Welcome to you! ; str.startsWith(Welcome,Qt:CaseSensitive); /返回true; str.
7、startsWith(you,Qt:CaseSensitive); /返回false; (2)函数QString:endsWith()类似于QString:startsWith(),此函数判断一个字符串是否以某个字符串结尾。 (3)函数QString:contains()判断一个指定的字符串是否出现过,例如: QString str= Welcome to you! ; str.contains(Welcome,Qt:CaseSensitive); /返回true;,2.1.2 查询字符串数据,(4)比较两个字符串也是经常使用的功能,QString提供了多种比较手段。 operator=(co
8、nst QString /初始化一个125的字符串 bool ok; int hex=str.toInt( /ok=true,dec=125 其中,int hex=str.toInt( /初始化一个字符串对象 QByteArray ba=str.toAscii(); /(a) qDebug()ba; /(b) ba.append(Hello,World! ); /(c) qDebug(),2.2 容器类,Qt的容器类为遍历其中的内容提供了以下两种方法。 (1)Java风格的迭代器(Java-style iterators)。 (2)STL风格的迭代器(STL-style iterators),
9、能够同Qt和STL的通用算法一起使用,并且在效率上也略胜一筹。,2.2.1 QList类、QLinkedList类和QVector类,表2.1列出了QList、QLinkedList和QVector容器的时间复杂度比较。,2.2.1 QList类、QLinkedList类和QVector类,1QList类 对于不同的数据类型,QList采取不同的存储策略,存储策略有以下几种。 (1)如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同),QList会将数值直接存储在它的数组中。 (2)如果QList存储对象的指针,则该指针指向实际存储的对象。 下面举一个
10、例子: #include int main(int argc,char *argv) QList list; /(a) QString str(This is a test string); liststr; /(b) /(c) qDebug()list0 How are you! ; return 0; ,2.2.1 QList类、QLinkedList类和QVector,2QLinkedList类 QLinkedList是一个链式列表,它以非连续的内存块保存数据。 QLinkedList不能使用下标,只能使用迭代器访问它的数据项。与QList相比,当对一个很大的列表进行插入操作时,QLin
11、kedList具有更高的效率。 3QVector类 QVector在相邻的内存中存储给定数据类型T的一组数值。在一个QVector的前部或者中间位置进行插入操作的速度是很慢的,这是因为这样的操作将导致内存中的大量数据被移动,这是由QVector存储数据的方式决定的。,2.2.1 QList类、QLinkedList类和QVector,4Java风格迭代器遍历容器 Java风格的迭代器是Qt 4加入的一个功能。同STL风格的迭代器相比,它使用起来更简单方便,不过这也是以轻微的性能损耗为代价的。对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型,即只读访问和读写访问,其分类见表2.
12、2。,2.2.1 QList类、QLinkedList类和QVector,下面以QList为例,介绍Java风格的两种迭代器的用法。QLinkedList和QVector具有和QList相同的遍历接口,在此不再详细讲解。 (1)QList只读遍历方法。 【例】(简单) 通过控制台程序实现QList只读遍历方法。 其具体代码如下: #include /(a) int main(int argc,char *argv) QList list; /创建一个QList栈对象list list i(list); /(b) for(;i.hasNext();) /(c) qDebug()i.next();
13、 return 0; 最后程序的运行结果为: 1 2 3 4 5,2.2.1 QList类、QLinkedList类和QVector,上述例子是QListIterator对列表进行向后遍历的函数,而对列表进行向前遍历的函数有如下几种。 QListIterator:toBack():将迭代点移动到最后一个列表项的后面。 QListIterator:hasPrevious():检查当前迭代点之前是否具有列表项。 QListIterator:previous():返回前一个列表项的内容并将迭代点移动到前一个列表项之前。,2.2.1 QList类、QLinkedList类和QVector,除此之外,Q
14、ListIterator提供的其他函数还有如下几种。 toFront():移动迭代点到列表的前端(第一个列表项的前面)。 peekNext():返回下一个列表项,但不移动迭代点。 peekPrevious():返回前一个列表项,但不移动迭代点。 findNext():从当前迭代点开始向后查找指定的列表项,如果找到,则返回true,此时迭代点位于匹配列表项的后面;如果没有找到,则返回false,此时迭代点位于列表的后端(最后一个列表项的后面)。 findPrevious():与findNext()类似,不同的是它的方向是向前的,查找操作完成后的迭代点在匹配项的前面或整个列表的前端。,2.2.1
15、QList类、QLinkedList类和QVector,(2)QListIterator是只读迭代器,它不能完成列表项的插入和删除操作。读写迭代器QMutableListIterator除了提供基本的遍历操作(与QListIterator的操作相同)外,还提供了insert()插入操作函数、remove()删除操作函数和修改数据函数等。 【例】(简单) 通过控制台程序实现QList读写遍历方法。具体代码如下。 最后编译,运行此程序,程序运行结果如下: 0 1 2 3 4 5 6 7 8 9 10 30 50 70 90,2.2.1 QList类、QLinkedList类和QVector,5ST
16、L风格迭代器遍历容器 STL风格迭代器的两种分类见表2.3。,2.2.1 QList类、QLinkedList类和QVector,【例】(简单) 使用STL风格迭代器。 具体代码如下: #include int main(int argc,char *argv) QList list; /初始化一个空的QList列表 for(int j=0;j:iterator i; /初始化一个QList:iterator读写迭代器 for(i=list.begin();i!=list.end();+i) /(b) qDebug(): const_iterator读写迭代器 QList:const_iter
17、ator ci; /在控制台输出列表的所有值 for(ci=list.constBegin();ci!=list.constEnd();+ci) qDebug()*ci; return 0; ,2.2.1 QList类、QLinkedList类和QVector,最后编译,运行此应用程序,输出结果如下: 0 1 2 3 4 5 6 7 8 9 0 10 20 30 40 50 60 70 80 90,2.2.2 QMap类和QHash类,QMap类和QHash类具有非常类似的功能,它们的差别仅在于: QHash具有比QMap更快的查找速度。 QHash以任意的顺序存储数据项,而QMap总是按照键
18、Key顺序存储数据。 QHash的键类型Key必须提供operator=()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提供operator()函数。 二者的时间复杂度比较见表2.4。,2.2.2 QMap类和QHash类,1QMap类 QMap提供了一个从类型为Key的键到类型为T的值的映射。 通常,QMap存储的数据形式是一个键对应一个值,并且按照键Key的次序存储数据。为了能够支持一键多值的情况,QMap提供了QMap:insertMulti()和QMap:values()函数。 2QHash类 QHash具有与QMap几乎完全相同的API。QHash维护着一张哈希
19、表(Hash Table),哈希表的大小与QHash的数据项的数目相适应。 QHash以任意的顺序组织它的数据。当存储数据的顺序无关紧要时,建议使用QHash作为存放数据的容器。,2.2.2 QMap类和QHash类,3Java风格迭代器遍历容器 对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。其分类见表2.5。,2.2.2 QMap类和QHash类,【例】(简单) 在QMap中的插入、遍历和修改。 具体代码如下: #include int main(int argc,char *argv) QMap map; /创建一个QMap栈对象
20、 /向栈对象插入对 map.insert(beijing,111); map.insert(shanghai,021); map.insert(nanjing,025); QMapIterator i(map); /创建一个只读迭代器 for(;i.hasNext();) /(a) qDebug() mi(map); if(mi.findNext(111) /(b) mi.setValue(010); QMapIterator modi(map); qDebug() ; for(;modi.hasNext();) /再次遍历并输出修改后的结果 qDebug() modi.key() setFo
21、nt( QFont( Times, 18, QFont:Bold ) ); connect( quit, SIGNAL(clicked(), qApp, SLOT(quit() ); MyWidget:MyWidget() ,2.5.1 按钮组(Buttons),(4)在源文件“main.cpp”中的具体代码如下: #include mywidget.h #include int main(int argc, char *argv) QApplication a(argc, argv); MyWidget w; w.setGeometry( 100, 100, 200, 120 ); w.sh
22、ow(); return a.exec(); (5)运行结果如图2.2所示。,2.5.2 输入部件组(Input Widgets),输入部件组(Input Widgets)如图2.3所示,组中各个部件的名称依次解释如下。,2.5.2 输入部件组(Input Widgets), Combo Box:组合框。 Font Combo Box:字体组合框。 Line Edit:行编辑。 Text Edit:文本编辑。 Plain Text Edit:纯文本编辑。 Spin Box:数字显示框(自旋盒)。 Double Spin Box:双自旋盒。 Time Edit:时间编辑。 Date Edit:日
23、期编辑。 Date/Time Edit:日期/时间编辑。 Dial:拨号。 Horizontal Scroll Bar:横向滚动条。 Vertical Scroll Bar:垂直滚动条。 Horizontal Slider:横向滑块。 Vertical Slider:垂直滑块。 Key sequence Edit:按键序列编辑。,2.5.2 输入部件组(Input Widgets),1QDateTime类 Date/Time Edit对应于QDateTime类,在Qt 5中可以使用它来获得系统时间。通过QDateTime:currentDateTime()来获取本地系统的时间和日期信号。可以通
24、过date()和time()来返回datetime中的日期和时间部分,代码如下: QLabel * datalabel =new QLabel(); QDateTime *datatime=new QDateTime(QDateTime:currentDateTime(); datalabel-setText(datatime-date().toString(); datalabel-show();,2.5.2 输入部件组(Input Widgets),2QTimer类 (1)新建一个定时器。 QTimer *time_clock=new QTimer(parent); (2)连接这个定时器的
25、信号和槽,利用定时器的timeout()。 connect(time_clock,SIGNAL(timeout(),this,SLOT(slottimedone(); (3)开启定时器,并设定定时周期。 定时器定时有两种方式:start(int time)和setSingleShot(true)。其中,start(int time)表示每隔“time”秒就会重启定时器,可以重复触发定时,利用stop()将定时器关掉;而setSingleShot(true)则是仅启动定时器一次。工程中常用的是前者,例如: time_clock-start(2000);,2.5.3 显示控件组(Display W
26、idgets),显示控件组(Display Widgets)如图2.4所示。,2.5.3 显示控件组(Display Widgets),显示控件组(Display Widgets)中各个控件的名称依次解释如下。 Label:标签。 Text Browser:文本浏览器。 Graphics View:图形视图。 Calendar:日历。 LCD Number:液晶数字。 Progress Bar:进度条。 Horizontal Line:水平线。 Vertical Line:垂直线。 Open GL Widget:开放式图形库工具。 QQuickWidget:嵌入QML工具。 QWebView:
27、Web视图。,2.5.3 显示控件组(Display Widgets),1Graphics View Graphics View对应于QGraphicsView类,提供了Qt 5的图形视图框架。 2Text Browser Text Browser对应于QTextBrowser类。QTextBrowser类继承自QTextEdit,而且仅是只读的,对里面的内容并不能进行更改,但是相对于QTextEdit来讲,它还具有链接文本的作用。QTextBrowser的属性有以下几点: modified : const bool /通过布尔值来说明其内容是否被修改 openExternalLinks :
28、bool openLinks : bool readOnly : const bool searchPaths : QStringList source : QUrl undoRedoEnabled : const bool,2.5.3 显示控件组(Display Widgets),通过以上的属性设置,可以设定QTextBrowser是否允许外部链接,是否为只读属性,外部链接的路径及链接的内容,是否可以进行撤销等操作。 QTextBrowser还提供了几种比较有用的槽(SLOTS),即: virtual void backward () virtual void forward () virt
29、ual void home (),2.5.3 显示控件组(Display Widgets),3QQuickWidget 这是Qt 5.3发布的一个新组件,传统QWidget程序可以用它来嵌入QML代码,为Qt开发者将桌面应用迁移到Qt Quick提供了方便,但目前在QML中尚不能嵌入其他非QML窗口,因为QML的渲染机制和QWidget的是不一样的。,2.5.4 空间间隔组(Spacers),空间间隔组(Spacers)如图2.5所示。,空间间隔组(Spacers)中各个控件的名称依次解释如下。 Horizontal Spacer:水平间隔。 Vertical Spacer:垂直间隔。,2.5
30、.5 布局管理组(Layouts),布局管理组(Layouts)如图2.6所示。,布局管理组(Layouts)中各个控件的名称依次解释如下。 Vertical Layout:垂直布局。 Horizontal Layout:横向(水平)布局。 Grid Layout:网格布局。 Form Layout:表单布局。,2.5.6 容器组(Containers),容器组(Containers)如图2.7所示。,容器组(Containers)中各个控件的名称依次解释如下。 Group Box:组框。 Scroll Area:滚动区域。 Tool Box:工具箱。 Tab Widget:标签小部件。 St
31、acked Widget:堆叠部件。 Frame:帧。 Widget:小部件。 MdiArea:MDI区域。 Dock Widget:停靠窗体部件。 QAxWidget:封装Flash的ActiveX控件。,2.5.6 容器组(Containers),1创建窗口 如果Widget未使用父级进行创建,则在显示时视为窗口或顶层Widget。由于顶层Widget没有父级对象类来确保在其不再使用时就删除,所以需要开发人员在应用程序中对其进行跟踪。 在本例中,使用QWidget创建和显示具有默认大小的窗口: QWidget *window = new QWidget(); window-resize(3
32、20, 240); window-show(); QPushButton *button = new QPushButton(tr(Press me), window); /(a) button-move(100, 100); button-show();,2.5.6 容器组(Containers),2使用布局 通常,子Widget是通过使用布局对象在窗口中进行排列的,而不是通过指定位置和大小进行排列的。在此,构造一个并排排列的标签和行编辑框Widget: QLabel *label = new QLabel(tr(Name:); QLineEdit *lineEdit = new QLine
33、Edit(); QHBoxLayout *layout = new QHBoxLayout(); layout-addWidget(label); layout-addWidget(lineEdit); window-setLayout(layout); 构造的布局对象管理通过addWidget()函数提供Widget的位置和大小。布局本身是通过调用setLayout()提供给窗口的。,2.5.6 容器组(Containers),由于Widget可包含其他Widget,所以布局可用来提供按不同层次分组的Widget。这里,要在显示查询结果的表视图上方、窗口顶部的行编辑框旁,显示一个标签: QL
34、abel *queryLabel = new QLabel(tr(Query:); QLineEdit *queryEdit = new QLineEdit(); QTableView *resultView = new QTableView(); QHBoxLayout *queryLayout = new QHBoxLayout(); queryLayout-addWidget(queryLabel); queryLayout-addWidget(queryEdit); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout-addL
35、ayout(queryLayout); mainLayout-addWidget(resultView); window-setLayout(mainLayout);,2.5.7 项目视图组(Item Views),项目视图组(Item Views)如图2.8所示。,项目视图组(Item Views)中各个控件的名称依次解释如下。 List View:清单视图。 Tree View:树视图。 Table View:表视图。 Column View:列视图。,2.5.7 项目视图组(Item Views),下面介绍此处的Table View与2.5.8节中的Table Widget的区别,其具体
36、区别见表2.10。,2.5.7 项目视图组(Item Views),QTableWidget继承自QTableView。QSqlTableModel能够与QTableView绑定,但不能与QTableWidget绑定。例如: QSqlTableModel *model = new QSqlTableModel; model-setTable(employee); model-setEditStrategy(QSqlTableModel:OnManualSubmit); model-select(); model-removeColumn(0); / 不显示 ID model-setHeader
37、Data(0, Qt:Horizontal, tr(Name); model-setHeaderData(1, Qt:Horizontal, tr(Salary); QTableView *view = new QTableView; view-setModel(model); view-show();,2.5.7 项目视图组(Item Views),视图与模型绑定时,模型必须使用new创建,否则视图不能随着模型的改变而改变。 下面是错误的写法: QStandardItemModel model(4,2); model.setHeaderData(0, Qt:Horizontal, tr(La
38、bel); model.setHeaderData(1, Qt:Horizontal, tr(Quantity); ui.tableView-setModel( ,2.5.7 项目视图组(Item Views),下面是正确的写法: QStandardItemModel *model; model = new QStandardItemModel(4,2); ui.tableView-setModel(model); model-setHeaderData(0, Qt:Horizontal, tr(Label); model-setHeaderData(1, Qt:Horizontal, tr(
39、Quantity); for (int row = 0; row index(row, column, QModelIndex(); model-setData(index, QVariant(row+1) * (column+1); ,2.5.8 项目控件组(Item Widgets),项目控件组(Item Widgets)如图2.9所示。,项目控件组(Item Widgets)中各个控件的名称依次解释如下。 List Widget:清单控件。 Tree Widget:树形控件。 Table Widget:表控件。,2.5.8 项目控件组(Item Widgets),【例】(难度中等) 创建
40、具有复选框的树形控件。实例文件见光盘CH209。 在Qt中,树形控件称为QTreeWidget,而控件里的树节点称为QTreeWidgetItem。这种控件其实有时很有用处。例如,利用飞信软件群发短信时,选择联系人的界面中就使用了有复选框的树形控件,如图2.10所示。,2.5.8 项目控件组(Item Widgets),具体步骤如下。 (1)新建Qt Widgets Application(详见1.3.1节),项目名称为“TreeWidget”,基类选择“QWidget”,类名保持“Widget”不变,保持“创建界面”复选框的选中状态。 (2)双击“widget.ui”文件,打开Qt的设计器,拖曳出一个QTreeWidget。 (3)在头文件“widget.h”中添加代码: #include 在类Widget声明中添加代码: public: void init(); void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年四川省资中县急诊医学(副高)考试题含答案
- 建议勇为管理办法
- 抽样封存管理办法
- 政法专项管理办法
- 政府节能管理办法
- 建筑人防管理办法
- 捐赠财务管理办法
- 战略编制管理办法
- 投诉监管管理办法
- 成控项目管理办法
- 职业卫生考试题库及答案模拟题
- 《少年仰起他的脸》阅读答案-2025年中考阅读真题
- 2025年山东省新高考政治试卷(含答案)
- 电梯安全总监职责培训考核试题及答案
- 生物医学工程师岗位面试问题及答案
- 2025年河北省高考化学试卷真题(含答案详解)
- 桥面系施工安全教育培训
- 职业卫生体检管理制度
- 车辆进厂出厂管理制度
- 大学教学质量反馈制度
- GB/T 6543-2025运输包装用单瓦楞纸箱和双瓦楞纸箱
评论
0/150
提交评论