Qt 5 開發(fā)及實例(第5版) 課件 第2章 Qt 5模板庫、工具類及控件_第1頁
Qt 5 開發(fā)及實例(第5版) 課件 第2章 Qt 5模板庫、工具類及控件_第2頁
Qt 5 開發(fā)及實例(第5版) 課件 第2章 Qt 5模板庫、工具類及控件_第3頁
Qt 5 開發(fā)及實例(第5版) 課件 第2章 Qt 5模板庫、工具類及控件_第4頁
Qt 5 開發(fā)及實例(第5版) 課件 第2章 Qt 5模板庫、工具類及控件_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

QT5開發(fā)及實例(第5版)第2章Qt5模板庫、工具類及控件——字符串類01操作字符串操作字符串(1)QString提供了一個二元的“+”操作符用于組合兩個字符串,并提供了一個“+=”操作符用于將一個字符串追加到另一個字符串的末尾,例如:QStringstr1="Welcome";str1=str1+"toyou!"; //str1="Welcometoyou!"QStringstr2="Hello,";str2+="World!"; //str2="Hello,World!"其中,QStringstr1="Welcome"傳遞給QString一個constchar*類型的ASCII字符串“Welcome”,它被解釋為一個典型的以“\0”結尾的C類型字符串。這將會導致調用QString構造函數(shù),來初始化一個QString字符串。其構造函數(shù)原型為:QT_ASCII_CAST_WARN_CONSTRUCTORQString::QString(constchar*str)被傳遞的constchar*類型的指針又將被QString::fromAscii()函數(shù)轉換為Unicode編碼。操作字符串(2)QString::append()函數(shù)具有與“+=”操作符同樣的功能,實現(xiàn)在一個字符串的末尾追加另一個字符串,例如:QStringstr1="Welcome";QStringstr2="to";str1.append(str2); //str1="Welcometo"str1.append("you!"); //str1="Welcometoyou!"(3)組合字符串的另一個函數(shù)是QString::sprintf(),此函數(shù)支持的格式定義符和C++庫中的函數(shù)sprintf()定義的一樣。例如:QStringstr;str.sprintf("%s","Welcome"); //str="Welcome"str.sprintf("%s","toyou!"); //str="toyou!"str.sprintf("%s%s","Welcome","toyou!"); //str="Welcometoyou!"操作字符串(4)Qt還提供了另一種方便的字符串組合方式,使用QString::arg()函數(shù),此函數(shù)的重載可以處理很多的數(shù)據(jù)類型。此外,一些重載具有額外的參數(shù)對字段的寬度、數(shù)字基數(shù)或者浮點數(shù)精度進行控制。通常,相對于QString::sprintf()函數(shù),QString::arg()函數(shù)是一個比較好的解決方案,因為其類型安全,完全支持Unicode,并且允許改變"%n"參數(shù)的順序。例如:QStringstr;str=QString("%1wasbornin%2.").arg("John").arg(1998);//str="Johnwasbornin1998."(5)QString也提供了一些其他組合字符串的方法,包括如下幾種。①insert()函數(shù):在原字符串特定的位置插入另一個字符串。②prepend()函數(shù):在原字符串的開頭插入另一個字符串。③replace()函數(shù):用指定的字符串代替原字符串中的某些字符。(6)很多時候,去掉一個字符串兩端的空白(空白字符包括回車字符“\n”、換行字符“\r”、制表符“\t”和空格字符“”等)非常有用,如獲取用戶輸入的賬號時。①QString::trimmed()函數(shù):移除字符串兩端的空白字符。②QString::simplified()函數(shù):移除字符串兩端的空白字符,使用單個空格字符“”代替字符串中出現(xiàn)的空白字符。例如:QStringstr="Welcome\tto\nyou!";str=str.trimmed(); //str="Welcome\tto\nyou!"02查詢字符串數(shù)據(jù)查詢字符串數(shù)據(jù)(1)QString::startsWith()函數(shù)判斷一個字符串是否以某個字符串開頭。此函數(shù)具有兩個參數(shù)。第一個參數(shù)指定了一個字符串,第二個參數(shù)指定是否大小寫敏感(默認情況下,是大小寫敏感的),例如:QStringstr="Welcometoyou!";str.startsWith("Welcome",Qt::CaseSensitive); //返回truestr.startsWith("you",Qt::CaseSensitive); //返回false(2)QString::endsWith()函數(shù)類似于QString::startsWith()函數(shù),此函數(shù)判斷一個字符串是否以某個字符串結尾。(3)QString::contains()函數(shù)判斷一個指定的字符串是否出現(xiàn)過,例如:QStringstr="Welcometoyou!";str.contains("Welcome",Qt::CaseSensitive); //返回true查詢字符串數(shù)據(jù)(4)比較兩個字符串也是經(jīng)常使用的功能,QString提供了多種比較手段。①operator<(constQString&):比較一個字符串是否小于另一個字符串。如果是,則返回true。②operator<=(constQString&):比較一個字符串是否小于等于另一個字符串。如果是,則返回true。③operator==(constQString&):比較兩個字符串是否相等。如果相等,則返回true。④operator>=(constQString&):比較一個字符串是否大于等于另一個字符串。如果是,則返回true。⑤localeAwareCompare(constQString&,constQString&):靜態(tài)函數(shù),比較前后兩個字符串。⑥compare(constQString&,constQString&,Qt::CaseSensitivity):該函數(shù)可以指定是否進行大小寫的比較,而大小寫的比較是完全基于字符的Unicode編碼值的,而且是非??斓?,返回值類似于localeAwareCompare()函數(shù)。03字符串的轉換字符串的轉換QString類提供了豐富的轉換函數(shù),可以將一個字符串轉換為數(shù)值類型或者其他的字符編碼集。(1)QString::toInt()函數(shù)將字符串轉換為整型數(shù)值,類似的函數(shù)還有toDouble()、toFloat()、toLong()、toLongLong()等。下面舉個例子說明其用法:QStringstr="125"; //初始化一個"125"的字符串boolok;inthex=str.toInt(&ok,16); //ok=true,hex=293intdec=str.toInt(&ok,10); //ok=true,dec=125(2)QString提供的字符編碼集的轉換函數(shù)將會返回一個constchar*類型版本的QByteArray,即構造函數(shù)QByteArray(constchar*)構造的QByteArray對象。QByteArray類具有一個字節(jié)數(shù)組,它既可以存儲原始字節(jié)(rawbytes),也可以存儲傳統(tǒng)的以“\0”結尾的8位的字符串。在Qt中,使用QByteArray比使用constchar*更方便,且QByteArray也支持隱式共享。轉換函數(shù)有以下幾種。①toAscii():返回一個ASCII編碼的8位字符串。②toLatin1():返回一個Latin-1(ISO8859-1)編碼的8位字符串。③toUtf8():返回一個UTF-8編碼的8位字符串(UTF-8是ASCII碼的超集,它支持整個Unicode字符集)。④toLocal8Bit():返回一個系統(tǒng)本地(locale)編碼的8位字符串。字符串的轉換下面舉例說明其用法:QStringstr="Welcometoyou!"; //初始化一個字符串對象QByteArrayba=str.toAscii(); //(a)qDebug()<<ba; //(b)ba.append("Hello,World!"); //(c)qDebug()<<ba.data(); //輸出最后結果一個NULL字符串就是使用QString的默認構造函數(shù)或者使用“(constchar*)0”作為參數(shù)的構造函數(shù)創(chuàng)建的QString字符串對象;而一個空字符串是一個大小為0的字符串。一個NULL字符串一定是一個空字符串,而一個空字符串未必是一個NULL字符串。例如:QString().isNull(); //結果為trueQString().isEmpty(); //結果為trueQString("").isNull(); //結果為falseQString("").isEmpty(); //結果為trueQT5開發(fā)及實例(第5版)第2章Qt5模板庫、工具類及控件——容器類容器類這樣的數(shù)據(jù)類型包含了通常使用的大多數(shù)數(shù)據(jù)類型,包括基本數(shù)據(jù)類型(如int和double等)和Qt的一些數(shù)據(jù)類型(如QString、QDate和QTime等)。不過,Qt的QObject及其他的子類(如QWidget和Qdialog等)是不能夠存儲在容器中的,例如:QList<QToolBar>list;一個可代替的方案是存儲QObject及其子類的指針,例如:QList<QToolBar*>list;Qt的容器類是可以嵌套的,例如:QHash<QString,QList<double>>Qt的容器類為遍歷其中的內容提供了以下兩種方法。(1)Java風格的迭代器(Java-styleiterators)。(2)STL風格的迭代器(STL-styleiterators),能夠同Qt和STL的通用算法一起使用,并且在效率上也略勝一籌。01QList類、QLinkedList類和QVector類1.QList類2.QLinkedList類3.QVector類4.Java風格迭代器遍歷容器5.STL風格迭代器遍歷容器QList類、QLinkedList類和QVector類經(jīng)常使用的Qt容器類有QList、QLinkedList和QVector等。在開發(fā)一個較高性能需求的應用程序時,程序員會比較關注這些容器類的運行效率。表列出了QList、QLinkedList和QVector容器的時間復雜度比較。容

類查

找插

入頭

加尾

加QListO(1)O(n)Amort.O(1)Amort.O(1)QLinkedListO(n)O(1)O(1)O(1)QVectorO(1)O(n)O(n)Amort.O(1)1.QList類QList<T>是迄今為止最常用的容器類,它存儲給定數(shù)據(jù)類型T的一列數(shù)值。繼承自QList類的子類有QItemSelection、QQueue、QSignalSpy、QStringList和QTestEventList。QList不僅提供了可以在列表中進行追加的QList::append()和Qlist::prepend()函數(shù),還提供了在列表中間完成插入操作的QList::insert()函數(shù)。相對于任何其他的Qt容器類,為了使可執(zhí)行代碼盡可能少,QList被高度優(yōu)化。QList<T>維護了一個指針數(shù)組,該數(shù)組存儲的指針指向QList<T>存儲的列表項的內容。因此,QList<T>提供了基于下標的快速訪問。QList類、QLinkedList類和QVector類對于不同的數(shù)據(jù)類型,QList<T>采取不同的存儲策略,存儲策略有以下幾種。(1)如果T是一個指針類型或指針大小的基本類型(即該基本類型占有的字節(jié)數(shù)和指針類型占有的字節(jié)數(shù)相同),QList<T>會將數(shù)值直接存儲在它的數(shù)組中。(2)如果QList<T>存儲對象的指針,則該指針指向實際存儲的對象。下面舉一個例子:#include<QDebug>intmain(intargc,char*argv[]){ QList<QString>list; //(a) { QStringstr("Thisisateststring"); list<<str; //(b) } //(c) qDebug()<<list[0]<<"Howareyou!"; return0;}QList類、QLinkedList類和QVector類2.QLinkedList類QLinkedList<T>是一個鏈式列表,它以非連續(xù)的內存塊保存數(shù)據(jù)。QLinkedList<T>不能使用下標,只能使用迭代器訪問它的數(shù)據(jù)項。與QList相比,當對一個很大的列表進行插入操作時,QLinkedList具有更高的效率。3.QVector類QVector<T>在相鄰的內存中存儲給定數(shù)據(jù)類型T的一組數(shù)值。在一個QVector的前部或者中間位置進行插入操作的速度是很慢的,這是因為這樣的操作將導致內存中的大量數(shù)據(jù)被移動,這是由QVector存儲數(shù)據(jù)的方式?jīng)Q定的。QVector<T>既可以使用下標訪問數(shù)據(jù)項,也可以使用迭代器訪問數(shù)據(jù)項。繼承自QVector類的子類有QPolygon、QPolygonF和QStack。QList類、QLinkedList類和QVector類4.Java風格迭代器遍歷容器Java風格迭代器同STL風格迭代器相比,使用起來更簡單方便,不過這也是以輕微的性能損耗為代價的。對于每一個容器類,Qt提供了兩種類型的Java風格迭代器數(shù)據(jù)類型,即只讀迭代器類和讀寫迭代器類,見表。容

類只讀迭代器類讀寫迭代器類QList<T>,QQueue<T>QListIterator<T>QMutableListIterator<T>QLinkedList<T>QLinkedListIterator<T>QMutableLinkedListIterator<T>QVector<T>,QStack<T>QVectorIterator<T>QMutableVectorIterator<T>QList類、QLinkedList類和QVector類(1)QList只讀遍歷方法?!纠浚ê唵危–H201)通過控制臺程序實現(xiàn)QList只讀遍歷方法。其具體代碼如下:#include<QCoreApplication> #include<QDebug> //(a)intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv); //(b)QList<int>list; //創(chuàng)建一個QList<int>棧對象listlist<<1<<2<<3<<4<<5; //用操作運算符“<<”輸入五個整數(shù)QListIterator<int>i(list); //(c)for(;i.hasNext();) //(d)qDebug()<<i.next();returna.exec();}QList類、QLinkedList類和QVector類(2)QListIterator<T>是只讀迭代器,它不能完成列表項的插入和刪除操作。讀寫迭代器QMutableListIterator<T>除提供基本的遍歷操作(與QListIterator的操作相同)外,還提供了insert()插入操作函數(shù)、remove()刪除操作函數(shù)和修改數(shù)據(jù)函數(shù)等。【例】(簡單)(CH202)通過控制臺程序實現(xiàn)QList讀寫遍歷方法。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //創(chuàng)建一個空的列表list QMutableListIterator<int>i(list); //創(chuàng)建上述列表的讀寫迭代器 for(intj=0;j<10;++j) i.insert(j); //(a) for(i.toFront();i.hasNext();) //(b) qDebug()<<i.next(); for(i.toBack();i.hasPrevious();) //(c) { if(i.previous()%2==0)

i.remove(); else i.setValue(i.peekNext()*10); //(d) } for(i.toFront();i.hasNext();) //重新遍歷并輸出列表 qDebug()<<i.next(); returna.exec();}QList類、QLinkedList類和QVector類5.STL風格迭代器遍歷容器對于每個容器類,Qt都提供了兩種類型的STL風格迭代器數(shù)據(jù)類型:一種提供只讀訪問;另一種提供讀寫訪問。由于只讀類型的迭代器的運行速度要比讀寫迭代器的運行速度快,所以應盡可能地使用只讀類型的迭代器。STL風格迭代器的兩種分類見表。容

類只讀迭代器類讀寫迭代器類QList<T>,QQueue<T>QList<T>::const_iteratorQList<T>::iteratorQLinkedList<T>QLinkedList<T>::const_iteratorQLinkedList<T>::iteratorQVector<T>,QStack<T>QVector<T>::const_iteratorQVector<T>::iteratorQList類、QLinkedList類和QVector類【例】(簡單)(CH203)使用STL風格迭代器。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //初始化一個空的QList<int>列表 for(intj=0;j<10;j++) list.insert(list.end(),j); //(a) QList<int>::iteratori; //初始化一個QList<int>::iterator讀寫迭代器 for(i=list.begin();i!=list.end();++i) //(b) { qDebug()<<(*i); *i=(*i)*10; } //初始化一個QList<int>::const_iterator讀寫迭代器 QList<int>::const_iteratorci; //在控制臺輸出列表的所有值 for(ci=list.constBegin();ci!=list.constEnd();++ci) qDebug()<<*ci; returna.exec();}02QMap類和QHash類1.QMap類2.QHash類3.Java風格迭代器遍歷容器4.STL風格迭代器遍歷容器QMap類和QHash類1.QMap類QMap<Key,T>提供了一個從類型為Key的鍵到類型為T的值的映射。通常,QMap存儲的數(shù)據(jù)形式是一個鍵對應一個值,并且按照鍵Key的順序存儲數(shù)據(jù)。為了能夠支持一鍵多值的情況,QMap提供了QMap<Key,T>::insertMulti()和QMap<Key,T>::values()函數(shù)。存儲一鍵多值的數(shù)據(jù)時,也可以使用QMultiMap<Key,T>容器,它繼承自QMap。2.QHash類QHash<Key,T>具有與QMap幾乎完全相同的API。QHash維護著一張哈希表(HashTable),哈希表的大小與QHash的數(shù)據(jù)項的數(shù)目相適應。QHash以任意的順序組織它的數(shù)據(jù)。當存儲數(shù)據(jù)的順序無關緊要時,建議使用QHash作為存放數(shù)據(jù)的容器。QHash也可以存儲一鍵多值形式的數(shù)據(jù),它的子類QMultiHash<Key,T>實現(xiàn)了一鍵多值的語義。QMap類和QHash類3.Java風格迭代器遍歷容器對于每一個容器類,Qt都提供了兩種類型的Java風格迭代器數(shù)據(jù)類型:一種提供只讀訪問;另一種提供讀寫訪問。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>QMap類和QHash類【例】(簡單)(CH204)在QMap中的插入、遍歷和修改。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QMap<QString,QString>map; //創(chuàng)建一個QMap棧對象 //向棧對象插入<城市,區(qū)號>對 map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMapIterator<QString,QString>i(map); //創(chuàng)建一個只讀迭代器 for(;i.hasNext();) //(a) { i.next(); qDebug()<<""<<i.key()<<""<<i.value(); } QMutableMapIterator<QString,QString>mi(map); if(mi.findNext("111")) //(b) mi.setValue("010"); QMapIterator<QString,QString>modi(map); qDebug()<<""; for(;modi.hasNext();) //再次遍歷并輸出修改后的結果 { modi.next(); qDebug()<<""<<modi.key()<<""<<modi.value(); } returna.exec();}QMap類和QHash類4.STL風格迭代器遍歷容器對于每一個容器類,Qt都提供了兩種類型的STL風格迭代器數(shù)據(jù)類型:一種提供只讀訪問;另一種提供讀寫訪問。STL風格迭代器的兩種分類見表。容

類只讀迭代器類讀寫迭代器類QMap<Key,T>,QMultiMap<Key,T>QMap<Key,T>::const_iteratorQMap<Key,T>::iteratorQHash<Key,T>,QMultiHash<Key,T>QHash<Key,T>::const_iteratorQHash<Key,T>::iteratorQMap類和QHash類【例】(簡單)(CH205)功能與使用Java風格迭代器的例子基本相同。不同的是,這里通過查找鍵來實現(xiàn)值的修改。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QMap<QString,QString>map; map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMap<QString,QString>::const_iteratori; for(i=map.constBegin();i!=map.constEnd();++i) qDebug()<<""<<i.key()<<""<<i.value(); QMap<QString,QString>::iteratormi; mi=map.find("beijing"); if(mi!=map.end()) mi.value()="010"; //(a) QMap<QString,QString>::const_iteratormodi; qDebug()<<""; for(modi=map.constBegin();modi!=map.constEnd();++modi) qDebug()<<""<<modi.key()<<""<<modi.value(); returna.exec();}QT5開發(fā)及實例(第5版)第2章Qt5模板庫、工具類及控件——QVariant類QVariant類【例】(簡單)(CH206)QVariant類的用法。以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創(chuàng)建Qt項目,項目名myVariant,“ClassInformation”頁基類選“QWidget”。建好項目后,在widget.cpp文件中編寫代碼,具體內容。QT5開發(fā)及實例(第5版)第2章Qt5模板庫、工具類及控件——算法及正則表達式01Qt5常用算法Qt5常用算法【例】(簡單)(CH207)幾個常用算法。#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa0(argc,argv); doublea=-19.3,b=9.7; doublec=qAbs(a); //(a) doublemax=qMax(b,c); //(b) intbn=qRound(b); //(c) intcn=qRound(c); 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); //(d) //調用qDebug()函數(shù)輸出所有的計算結果 qDebug()<<"qSwap(bn,cn):"<<"bn="<<bn<<"cn="<<cn; returna0.exec();}02基本的正則表達式基本的正則表達式正則表達式由表達式(expressions)、量詞(quantifiers)和斷言(assertions)組成。(1)最簡單的表達式是一個字符。字符集可以使用表達式如“[AEIOU]”,表示匹配所有的大寫元音字母;使用“[^AEIOU]”,表示匹配所有非元音字母,即輔音字母;連續(xù)的字符集可以使用表達式如“[a-z]”,表示匹配所有的小寫英文字母。(2)量詞說明表達式出現(xiàn)的次數(shù),如“x[1,2]”表示“x”可以至少有一個,至多有兩個。在計算機語言中,標識符通常要求以字母或下畫線(也稱下畫線)開頭,后面可以是字母、數(shù)字和下畫線。滿足條件的標識符表示為:"[A-Za-z_]+[A-Za-z_0-9]*"正則表達式的量詞見表。量

詞含

義量

詞含

義E?匹配0次或1次E[n,]至少匹配n次E+匹配1次或多次E[,m]最多匹配m次E*匹配0次或多次E[n,m]至少匹配n次,最多匹配m次E[n]匹配n次

基本的正則表達式(3)“^”“$”“\b”都是正則表達式的斷言,正則表達式的斷言見表。符

號含

義符

號含

義^表示在字符串開頭進行匹配\B非單詞邊界$表示在字符串結尾進行匹配(?=E)表示表達式后緊隨E才匹配\b單詞邊界(?!E)表示表達式后不跟隨E才匹配例如,若要只有在using后面是namespace時才匹配using,則可以使用“using(?=E\s+namespace)”(此處“?=E”后的“\s”表示匹配一個空白字符,下同)。QT5開發(fā)及實例(第5版)第2章Qt5模板庫、工具類及控件——控

件01按鈕組(Buttons)按鈕組(Buttons)按鈕組(Buttons)如圖。按鈕組(Buttons)中各個按鈕的名稱依次解釋如下。

PushButton:按鈕。

ToolButton:工具按鈕。

RadioButton:單選按鈕。

CheckBox:復選框。

CommandLinkButton:命令鏈接按鈕。

DialogButtonBox:對話框按鈕盒。按鈕組(Buttons)【例】(簡單)(CH208)以QPushButton為例介紹按鈕的用法。(1)以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創(chuàng)建Qt項目,項目名PushButtonTest,“ClassInformation”頁基類選“QWidget”,類名命名為“MyWidget”。(2)在頭文件mywidget.h中的具體代碼如下:#ifndefMYWIDGET_H#defineMYWIDGET_H#include<QWidget>classMyWidget:publicQWidget{Q_OBJECTpublic:MyWidget(QWidget*parent=0);~MyWidget();};#endif//MYWIDGET_H按鈕組(Buttons)(3)在源文件mywidget.cpp中的具體代碼如下:#include"mywidget.h"#include<qapplication.h>#include<qpushbutton.h>#include<qfont.h>MyWidget::MyWidget(QWidget*parent):QWidget(parent){setMinimumSize(200,120);setMaximumSize(200,120);QPushButton*quit=newQPushButton("Quit",this);quit->setGeometry(62,40,75,30);quit->setFont(QFont("Times",18,QFont::Bold));connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));}MyWidget::~MyWidget(){}按鈕組(Buttons)(4)在源文件main.cpp中的具體代碼如下:#include"mywidget.h"#include<QApplication>intmain(intargc,char*argv[]){ QApplicationa(argc,argv); MyWidgetw; w.setGeometry(100,100,200,120); w.show(); returna.exec();}(5)QPushButton實例的運行結果如圖。02輸入部件組(InputWidgets)1.QDateTime類2.QTimer類輸入部件組(InputWidgets)輸入部件組(InputWidgets)如圖,組中各個部件的名稱依次解釋如下。

ComboBox:組合框。

FontComboBox:字體組合框。

LineEdit:行編輯框。

TextEdit:文本編輯框。

PlainTextEdit:純文本編輯框。

SpinBox:數(shù)字顯示框(自旋盒)。

DoubleSpinBox:雙自旋盒。

TimeEdit:時間編輯。

DateEdit:日期編輯。

Date/TimeEdit:日期/時間編輯。

Dial:撥號。

HorizontalScrollBar:橫向滾動條。

VerticalScrollBar:垂直滾動條。

HorizontalSlider:橫向滑塊。

VerticalSlider:垂直滑塊。

KeySequenceEdit:按鍵序列編輯框。輸入部件組(InputWidgets)1.QDateTime類Date/TimeEdit對應于QDateTime類,在Qt5中可以使用它來獲得系統(tǒng)時間。通過QDateTime::currentDateTime()來獲取本地系統(tǒng)的時間和日期信息??梢酝ㄟ^date()和time()來返回datetime中的日期和時間部分,典型代碼如下:QLabel*datalabel=newQLabel();QDateTime*datatime=newQDateTime(QDateTime::currentDateTime());datalabel->setText(datatime->date().toString());datalabel->show();輸入部件組(InputWidgets)2.QTimer類定時器(QTimer)的使用非常簡單,只需要以下幾個步驟就可以完成定時器的應用。(1)新建一個定時器。QTimer*time_clock=newQTimer(parent);(2)連接這個定時器的信號和槽,利用定時器的timeout()。connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));即定時時間一到就會發(fā)送timeout()信號,從而觸發(fā)slottimedone()槽去完成某件事情。(3)開啟定時器,并設定定時周期。定時器定時有兩種方式:start(inttime)和setSingleShot(true)。其中,start(inttime)表示每隔“time”秒就會重啟定時器,可以重復觸發(fā)定時,利用stop()將定時器關掉;而setSingleShot(true)則是僅啟動定時器一次。工程中常用的是前者,例如:time_clock->start(2000);03顯示控件組(DisplayWidgets)1.GraphicsView2.TextBrowser3.QQuickWidget顯示控件組(DisplayWidgets)顯示控件組(DisplayWidgets)如圖。顯示控件組(DisplayWidgets)中各個控件的名稱依次解釋如下。

Label:標簽。

TextBrowser:文本瀏覽器。

GraphicsView:圖形視圖。

CalendarWidget:日歷。

LCDNumber:液晶數(shù)字。

ProgressBar:進度條。

HorizontalLine:水平線。

VerticalLine:垂直線。

OpenGLWidget:開放式圖形庫工具。

QQuickWidget:嵌入QML工具。顯示控件組(DisplayWidgets)1.GraphicsViewGraphicsView對應于QGraphicsView類,提供了Qt5的圖形視圖框架2.TextBrowserTextBrowser對應于QTextBrowser類。QTextBrowser類繼承自QTextEdit,而且僅是只讀的,對里面的內容不能進行更改,但是相對于QTextEdit來講,它還具有鏈接文本的作用。QTextBrowser的屬性有以下幾點:modified:constbool//通過布爾值來說明其內容是否被修改openExternalLinks:boolopenLinks:boolreadOnly:constboolsearchPaths:QStringListsource:QUrlundoRedoEnabled:constbool通過以上的屬性設置,可以設定QTextBrowser是否允許外部鏈接,是否為只讀屬性,外部鏈接的路徑及鏈接的內容,是否可以進行撤銷等操作。QTextBrowser還提供了幾種比較有用的槽(SLOTS),即:virtualvoidbackward()virtualvoidforward()virtualvoidhome()顯示控件組(DisplayWidgets)3.QQuickWidget傳統(tǒng)QWidget程序可以用它來嵌入QML代碼,為Qt開發(fā)者將桌面應用遷移到QtQuick提供了方便,但目前在QML中尚不能嵌入其他非QML窗口,因為QML的渲染機制和QWidget的是不一樣的。04空間間隔組(Spacers)空間間隔組(Spacers)空間間隔組(Spacers)如圖??臻g間隔組(Spacers)中各個控件的名稱依次解釋如下。

HorizontalSpacer:水平間隔。

VerticalSpacer:垂直間隔。05布局管理組(Layouts)布局管理組(Layouts)布局管理組(Layouts)如圖。布局管理組(Layouts)中各個控件的名稱依次解釋如下。VerticalLayout:垂直布局。HorizontalLayout:橫向(水平)布局。GridLayout:網(wǎng)格布局。FormLayout:表單布局。06容器組(Containers)1.創(chuàng)建窗口2.使用布局容器組(Containers)容器組(Containers)如圖。容器組(Containers)中各個控件的名稱依次解釋如下。

GroupBox:組框。

ScrollArea:滾動區(qū)域。

ToolBox:工具箱。

TabWidget:標簽小部件。

StackedWidget:堆疊部件。

Frame:幀。

Widget:小部件。

MDIArea:MDI區(qū)域。

DockWidget:??看绑w部件。

QAxWidget:封裝Flash的ActiveX控件。容器組(Containers)1.創(chuàng)建窗口如果Widget未使用父級進行創(chuàng)建,則在顯示時視為窗口或頂層Widget。由于頂層Widget沒有父級對象類來確保在其不再被使用時就被刪除,所以需要開發(fā)人員在應用程序中對其進行跟蹤。例如,使用QWidget創(chuàng)建和顯示具有默認大小的窗口:QWidget*window=newQWidget();window->resize(320,240);window->show();QPushButton*button=newQPushButton(tr("Pressme"),window);button->move(100,100);button->show();容器組(Containers)2.使用布局通常,子Widget是通過使用布局對象在窗口中進行排列的,而不是通過指定位置和大小進行排列的。在此,構造一個并排排列的標簽和行編輯框Widget:QLabel*label=newQLabel(tr("Name:"));QLineEdit*lineEdit=newQLineEdit();QHBoxLayout*layout=newQHBoxLayout();layout->addWidget(label);layout->addWidget(lineEdit);window->setLayout(layout);構造的布局對象管理通過addWidget()函數(shù)提供Widget的位置和大小。布局本身是通過調用setLayout()函數(shù)提供給窗口的。布局僅可通過其對所管理的Widget(或其他布局)的顯示效果來展示。容器組(Containers)由于Widget可包含其他Widget,所以布局可用來提供按不同層次分組的Widget。這里,要在顯示查詢結果的表視圖上方、窗口頂部的行編輯框旁顯示一個標簽:QLabel*queryLabel=newQLabel(tr("Query:"));QLineEdit*queryEdit=newQLineEdit();QTableView*resultView=newQTableView();QHBoxLayout*queryLayout=newQHBoxLayout();queryLayout->addWidget(queryLabel);queryLayout->addWidget(queryEdit);QVBoxLayout*mainLayout=newQVBoxLayout();mainLayout->addLayout(queryLayout);mainLayout->addWidget(resultView);window->setLayout(mainLayout);07項目視圖組(ItemViews)項目視圖組(ItemViews)項目視圖組(ItemViews)如圖。項目視圖組(ItemViews)中各個控件的名稱依次解釋如下。

ListView:清單視圖。

TreeView:樹形視圖。

TableView:表視圖。

ColumnView:列視圖。下面介紹此處的TableView與2.5.8節(jié)中的TableWidget的區(qū)別,其具體區(qū)別見表。區(qū)

點QTableViewQTableWidget繼承關系

QTableWidget繼承自QTableView使用數(shù)據(jù)模型setModel可以使用setModel設置數(shù)據(jù)模型setModel是私有函數(shù),不能使用該函數(shù)設置數(shù)據(jù)模型顯示復選框setCheckState沒有函數(shù)實現(xiàn)復選框QTableWidgetItem類中的setCheckState(Qt::Checked);可以設置復選框與QSqlTableModel綁定QTableView能與QSqlTableModel綁定QTableWidget不能與QSqlTableModel綁定項目視圖組(ItemViews)QTableWidget繼承自QTableView。QSqlTableModel能夠與QTableView綁定,但不能與QTableWidget綁定。例如:QSqlTableModel*model=newQSqlTableModel;model->setTable("employee");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();model->removeColumn(0);//不顯示IDmodel->setHeaderData(0,Qt::Horizontal,tr("Name"));model->setHeaderData(1,Qt::Horizontal,tr("Salary"));QTableView*view=newQTableView;view->setModel(model);view->show();項目視圖組(ItemViews)視圖與模型綁定時,模型必須使用new創(chuàng)建,否則視圖不能隨著模型的改變而改變。下面是錯誤的寫法:QStandardItemModelmodel(4,2);model.setHeaderData(0,Qt::Horizontal,tr("Label"));model.setHeaderData(1,Qt::Horizontal,tr("Quantity"));ui.tableView->setModel(&model);for(introw=0;row<4;++row){ for(intcolumn=0;column<2;++column) { QModelIndexindex=model.index(row,column,QModelIndex()); model.setData(index,QVariant((row+1)*(column+1))); }}項目視圖組(ItemViews)下面是正確的寫法:QStandardItemModel*model;model=newQStandardItemModel(4,2);ui.tableView->setModel(model);model->setHeaderData(0,Qt::Horizontal,tr("Label"));model->setHeaderData(1,Qt::Horizontal,tr("Quantity"));for(introw=0;row<4;++row){ for(intcolumn=0;column<2;++column) { QModelIndexindex=model->index(row,column,QModelIndex()); model->setData(index,QVariant((row+1)*(column+1))); }}08項目控件組(ItemWidgets)項目控件組(ItemWidgets)項目控件組(ItemWidgets)如圖。項目控件組(ItemWidgets)中各個控件的名稱依次解釋如下。

ListWidget:清單控件。

TreeWidget:樹形控件。

TableWidget:表控件?!纠浚y度中等)(CH209)創(chuàng)建具有復選框的樹形控件。在Qt中,樹形控件稱為QTreeWidget,而控件里的樹形節(jié)點稱為QTreeWidgetItem。這種控件有時很有用處。例如,利用飛信軟件群發(fā)短信時,選擇聯(lián)系人的界面中就使用了有復選框的樹形控件,如圖。項目控件組(ItemWidgets)要實現(xiàn)這種界面其實很簡單。首先在Qt的設計器中拖曳出一個QTreeWidget,然后在主窗口中編寫一個函數(shù)init初始化界面,連接樹形控件的節(jié)點改變信號itemChanged(QTreeWidgetItem*item,intcolumn),實現(xiàn)這個信號即可。具體步驟如下。(1)以“設計器(QtDesigner)”(即保持勾選“Generateform”復選框)方式創(chuàng)建Qt項目,項目名TreeWidget,“ClassInformation”頁基類選“QWidget”。(2)雙擊widget.ui文件,打開設計器,拖曳出一個QTreeWidget控件。(3)在頭文件widget.h中添加代碼:#include<QTreeWidgetItem>在類Widget聲明中添加代碼:public:voidinit();voidupdateParentItem(QTreeWidgetItem*item);publicslots:voidtreeItemChanged(QTreeWidgetItem*item,intcolumn);項目控件組(ItemWidgets)(4)在源文件widget.cpp的類Widget構造函數(shù)中添加代碼:init();connect(ui->treeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(treeItemChanged(QTreeWidgetItem*,int)));在此文件中實現(xiàn)各個函數(shù)的具體代碼。函數(shù)treeItemChanged()的具體實現(xiàn)代碼。函數(shù)updateParentItem()的具體實現(xiàn)代碼。(5)運行結果如圖。09多控件實例多控件實例【例】(難度一般)(CH210)將多個控件以伙伴關系組織起來,呈現(xiàn)在界面上。具體步驟如下。(1)以“設計器(QtDe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論