Qt 5 開發及實例(第5版) 課件全套 陸文周 第1章 Qt概述 -第21章 Qt Quick Controls開發基礎_第1頁
Qt 5 開發及實例(第5版) 課件全套 陸文周 第1章 Qt概述 -第21章 Qt Quick Controls開發基礎_第2頁
Qt 5 開發及實例(第5版) 課件全套 陸文周 第1章 Qt概述 -第21章 Qt Quick Controls開發基礎_第3頁
Qt 5 開發及實例(第5版) 課件全套 陸文周 第1章 Qt概述 -第21章 Qt Quick Controls開發基礎_第4頁
Qt 5 開發及實例(第5版) 課件全套 陸文周 第1章 Qt概述 -第21章 Qt Quick Controls開發基礎_第5頁
已閱讀5頁,還剩836頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

QT5開發及實例(第5版)第1章Qt概述——什么是Qt01Qt的產生和發展Qt的產生和發展2008年,諾基亞公司從奇趣收購了Qt,并從2009年5月發布的Qt4.5起開放源代碼。2011年,Digia公司(芬蘭的一家IT服務公司)從諾基亞收購了Qt的商業版權。2012年8月9日,諾基亞宣布將Qt軟件業務正式出售給Digia。2013年7月3日,Digia公司發布Qt5.1并于次年4月配套推出了Qt跨平臺的集成開發環境QtCreator3.1.0。2014年9月16日,Digia成立了一個名為TheQtCompany的全資子公司,以進一步推動Qt產品的開發和市場擴張,并建立起全新的Qt產品網站www.qt.io,該網站將Qt的商業業務和開源社區統一到同一個在線渠道之中。02Qt5.15與Qt6Qt5.15與Qt6隨著互聯網邁入“云”時代及物聯網的興起,TheQtCompany緊跟潮流于2020年底發布了面向未來生產力平臺的Qt6。因Digia志在同時成為桌面、嵌入式、移動互聯網等眾多領域的開拓者,對Qt6進行了“大刀闊斧”的重構,將原Qt5的大量傳統模塊和庫從Qt中剔除,從零開始基于最新的技術重新研發它們的替代品,并制定了雄心勃勃的計劃,但是這么一來卻使得原來基于Qt5開發的很多軟件功能在Qt6上暫時無法實現(因官方與之對應的新技術模塊/庫尚未來得及做出來),為保持兼容和維護Qt生態圈的穩定,官方在發布Qt6的同時也推出了Qt5.15,它是一個長支持(LTS)版本,可看作是Qt5系列的“封筆之作”。QT5開發及實例(第5版)第1章Qt概述——Qt5.15的安裝01下載Qt在線安裝器和申請免費賬號下載Qt在線安裝器和申請免費賬號訪問Qt官網https://www.qt.io,點主頁右上角

按鈕進入“GetQt&QA”頁,找到“TryQtFrameworkandTools”版塊,如圖1.1所示,單擊“DownloadQt”按鈕,彈出Qt申請免費賬號頁,如圖1.2所示。下載Qt在線安裝器和申請免費賬號圖1.2申請免費賬號下載Qt在線安裝器和申請免費賬號根據頁面欄目填寫信息,填寫完單擊底部“Submit”按鈕,如果填寫的信息形式上沒問題,系統首先向用戶提供的電話(筆者的是+8617714319***)發6位短信,在隨后出現的驗證對話框輸入短信驗證碼,驗證通過后,輸入賬號密碼和對密碼再次輸入確認,系統會給用戶提供的電子郵箱發送郵件。完成后顯示頁面如圖。下載Qt在線安裝器和申請免費賬號該頁面包含兩個方面信息:(1)提供在線安裝器下載。單擊“here”超鏈接,系統自動識別當前操作者使用的計算機操作系統,并提供與之匹配的安裝器,用戶直接確認下載即可。(2)提示用戶根據Qt官方發送的郵件鏈接盡快登錄驗證,因為該鏈接有時效,使用后不能再用。進入該鏈接網頁,如圖完成Qt賬號登錄。

02安裝過程安裝過程安裝前要確保計算機是處于聯網狀態。(1)雙擊下載的安裝器文件,啟動向導,出現如圖界面,要求輸入Qt賬號(也就是剛剛申請的免費賬號),輸入完單擊“下一步”按鈕。(2)接下來出現“開源義務”頁,勾選“我已閱讀并同意使用開源Qt的條款和條件”和“我是個人用戶,我不為任何公司使用Qt”,單擊“下一步”按鈕。安裝過程(3)在“安裝程序-Qt”頁直接單擊“下一步”按鈕。安裝器自動獲取遠程Qt安裝所需的元信息,進入“ContributetoQtDevelopment”頁顯示提示信息,用戶可選擇向Qt官方發送(或不發送)有關自己Qt使用的統計信息。單擊“下一步”按鈕。(4)在“安裝文件夾”頁顯示如圖。安裝過程(5)在“選擇組件”頁選擇要安裝的組件,如圖。因為要安裝的是Qt5.15,我們在界面中央區樹狀視圖的“Qt”節點下找到“Qt5.15.2”項,展開,看到其包含的所有組件,只須選擇其中的部分進行安裝。安裝過程再選擇其他模塊,有幾個模塊在本書實例開發中可能會用到,所以建議大家在此一并選擇裝上,如圖是筆者安裝Qt5.15時的勾選項,供參考。(6)在“許可協議”頁,選中“Ihavereadandagreetothetermscontainedinthelicenseagreements.”接受許可協議,單擊“下一步”按鈕。(7)在“開始菜單快捷方式”頁可命名Qt啟動菜單名,這里保持默認名,單擊“下一步”按鈕。(8)在“準備安裝”頁顯示需要的磁盤空間,點“安裝”按鈕,開始在線安裝Qt5.15。安裝過程安裝完成的界面如圖,單擊“完成”按鈕結束安裝。系統會自行啟動QtCreator。03運行QtCreator運行QtCreatorQtCreator啟動后進入初始界面,如圖。04Qt5.15開發環境Qt5.15開發環境在Qt程序開發過程中,可以通過Qt的GUI界面設計器(QtDesigner)進行程序界面的繪制和布局,QtDesigner設計環境如圖。Qt5.15開發環境

對象檢查器(ObjectInspector):以兩列表格的形式列出窗體中每個控件的對象名及所屬類。初始窗體上尚未放置任何控件時,僅有窗體自身的一個條目,可看到它的類型為QDialog(對話框)。

屬性編輯器(PropertyEditor):以兩列表格的形式顯示當前窗體或其上被選中控件的屬性和值,可根據設計需要在其中修改屬性值。

Action編輯器(ActionEditor):用于編輯菜單/工具欄的選項動作。

信號和槽編輯器(SignalsandSlotsEditor):列出了窗體界面上所有的信號/槽關聯。Qt5.15開發環境設計區窗體的頂部有一系列工具按鈕可用于在設計界面時切換編輯模式,Qt支持四種編輯模式,如圖。Qt5.15開發環境各模式的用途簡介如下。

編輯控件(EditWidgets):這是默認的模式,可以在窗體上拖曳放置控件并設置它們的屬性和外觀。

編輯信號/槽(EditSignals/Slots):此模式下可以為窗體上的控件關聯系統中已有的信號和槽。

編輯伙伴(EditBuddies):可以建立QLabel標簽與其他類型控件的伙伴關系,即當用戶激活標簽的快捷鍵時,鼠標/鍵盤的焦點會轉移到它的伙伴控件上。Qt中只有QLabel標簽對象才可以有伙伴控件,也只有該QLabel對象具有快捷鍵(在顯示文本的某個字符前面添加一個前綴“&”就可以定義快捷鍵)時,伙伴關系才有效。例如:QLineEdit*leAge=newQLineEdit(this);QLabel*lbAge=newQLabel("&Age",this);lbAge->setBuddy(leAge);

編輯Tab順序(EditTabOrder):可以設置Tab鍵在窗體控件間的焦點順序。QT5開發及實例(第5版)第1章Qt概述——Qt5開發入門實例Qt5開發入門實例當用戶輸入一個圓的半徑后,可以顯示計算后的圓周長和面積值,運行效果如圖。01設計器QtDesigner開發實例1.創建Qt項目2.界面設計3.認識程序啟動入口4.關聯信號與槽5.功能開發設計器QtDesigner開發實例【例】(簡單)(CH101)采用設計器QtDesigner實現計算圓面積,完成上圖所示的功能。首先創建Qt項目,接著進行界面設計,然后編寫相應的功能代碼。1.創建Qt項目(1)運行QtCreator,在歡迎界面左側點“CreateProject...”按鈕,或者選擇“文件”→“NewProject...”命令,創建一個新的項目,出現“NewProject”窗口,如圖。設計器QtDesigner開發實例(2)選擇一個項目模板。點左欄“Projects”列表下的“Application(Qt)”,中間欄選“QtWidgetsApplication”選項,單擊右下角“Choose...”按鈕,進入下一步。(3)命名自己的項目并選擇保存路徑。項目命名沒有大小寫要求,依個人習慣,這里將項目命名為CircleCal。注意:保存項目的路徑中不能有中文字符。如圖所示,單擊“下一步”按鈕進入下一步驟。設計器QtDesigner開發實例(4)接下來的界面讓用戶選擇項目的構建(編譯)工具,這里選qmake,如圖所示,單擊“下一步”按鈕。設計器QtDesigner開發實例(5)在“ClassInformation”頁根據實際需要選擇一個“基類”。這里選擇QDialog對話框類作為基類,“Classname”(類名)填寫Dialog,這時“Headerfile”(頭文件)、“Sourcefile”(源文件)及“Formfile”(界面文件)都出現默認的文件名dialog,但建議讀者根據項目程序功能改名,這里將3個文件都重命名為circleCal。默認選中“Generateform”(創建界面)復選框,表示需要采用設計器QtDesigner來可視化地設計界面,如圖所示,單擊“下一步”按鈕。設計器QtDesigner開發實例(6)再次單擊“下一步”按鈕,進入“KitSelection”(選擇構建套件)界面,由于之前安裝選擇組件的時候已經指定了使用唯一的編譯器MinGW,故這里只有一個選項“DesktopQt5.15.2MinGW64-bit”,如圖,直接單擊“下一步”按鈕進入下一步驟即可。設計器QtDesigner開發實例(7)此時,相應的文件已經自動加載到項目文件列表中,如圖。設計器QtDesigner開發實例QtCreator界面左上方出現項目結構的樹形視圖,項目的所有文件自動在視圖中分類顯示,如圖1.20(a)所示,各文件包含在相應的節點中,單擊節點前的“”圖標可以顯示該節點下的文件;而單擊節點前的“”圖標則可隱藏該節點下的文件。單擊上部灰色工具欄中的過濾符號后,彈出一個下拉列表,勾選“簡化樹形視圖”則切換到簡單的文件列表樣式,如圖1.20(b)所示。

設計器QtDesigner開發實例2.界面設計拖曳左側組件箱的滑動條,在最后的DisplayWidgets容器欄(如圖1)中找到Label標簽控件,拖曳三個此控件到中央設計區的窗體上;同樣,在InputWidgets容器欄(如圖2)中找到LineEdit單行文本框控件,也拖曳三個到窗體上,用于輸入半徑值及顯示計算結果;在Buttons容器欄(如圖3)中找到PushButton按鈕控件,拖曳一個到窗體上。

設計器QtDesigner開發實例設置窗體上各控件的屬性。分別選中要設置屬性的控件,根據表1.1在設計環境右下方的屬性編輯器中進行設置。編號控件類別對象名稱屬性說明

DialogDialoggeometry:[(0,0),350x200]windowTitle:計算圓面積①Labellabelgeometry:[(80,40),71x21]text:半徑=②Labellabel_2geometry:[(80,80),71x21]text:周長=③Labellabel_3geometry:[(80,120),71x21]text:面積=④LineEditleRadiusgeometry:[(140,40),113x21]⑤LineEditleLengthenabled:取消勾選,表示本文本框不可輸入geometry:[(140,80),113x21]⑥LineEditleAreaenabled:取消勾選,表示本文本框不可輸入geometry:[(140,120),113x21]⑦PushButtonpbCalgeometry:[(140,160),93x28]text:計算設計器QtDesigner開發實例設計區窗體呈現的效果如圖。此時從對象檢查器可看到窗體中各控件對象的名稱及所屬的類,如圖。設計器QtDesigner開發實例3.認識程序啟動入口在開發功能之前,先來簡單認識一下Qt程序的啟動入口。每個Qt項目都有一個最初執行的入口函數,在項目樹形視圖的“Sources”節點下找到main.cpp文件,其中的main()函數就是整個項目程序的啟動入口,如下:#include"circleCal.h" //(a)

#include<QApplication> //(b)

intmain(intargc,char*argv[]) //(c){QApplicationa(argc,argv); //(d)Dialogw; //創建一個對話框對象w.show(); //(e)returna.exec(); //(f)}設計器QtDesigner開發實例4.關聯信號與槽(1)添加槽右擊對象檢查器中的“Dialog”對象,彈出快捷菜單選擇“改變信號/槽...”,彈出“Dialog的信號/槽”對話框,點上部“槽”列表左下角的按鈕,列表中出現一可編輯條目,輸入槽calCircle(),點“確定”按鈕,如圖。設計器QtDesigner開發實例(2)進入“信號/槽”編輯模式點設計區窗體頂部的(編輯信號/槽)按鈕或選擇主菜單“編輯”→“EditSignals/Slots”。(3)按鈕clicked信號連接槽移動鼠標指針到“計算”(pbCal)按鈕上,按鈕周邊出現紅色邊框,按下左鍵拖曳,從按鈕上拉出一條接地線,如圖。設計器QtDesigner開發實例(4)文本框returnPressed信號連接槽操作類同第(3)步,拖曳半徑文本框(leRadius)接地,在彈出“配置連接”對話框中分別選中文本框的returnPressed信號與窗體的calCircle()槽,點“確定”按鈕。以上兩個信號與槽關聯好的界面如圖。設計器QtDesigner開發實例5.功能開發首先,在circleCal.h中聲明槽函數calCircle()(加黑處),如下:#ifndefDIALOG_H#defineDIALOG_H

#include<QDialog>

QT_BEGIN_NAMESPACEnamespaceUi{classDialog;}QT_END_NAMESPACE

classDialog:publicQDialog{Q_OBJECT //(a)

public:Dialog(QWidget*parent=nullptr);~Dialog();

privateslots:

voidcalCircle(); //(b)

private:Ui::Dialog*ui; //(c)};#endif//DIALOG_H在circleCal.cpp中編寫槽函數calCircle()的實現代碼(加黑段),如下。02直接代碼開發實例1.創建Qt項目2.代碼定義界面3.關聯信號與槽4.功能開發直接代碼開發實例【例】(簡單)

(CH102)采用編寫代碼的方式來實現計算圓面積的功能。實現步驟如下。1.創建Qt項目創建過程同上節設計器QtDesigner開發實例,只是第(5)步在“ClassInformation”頁取消“Generateform”(創建界面)復選框的選中狀態,這樣創建的Qt項目樹形視圖中將不包含“Forms”節點及其下的circleCal.ui文件,故無法進入QtDesigner設計環境,只能用代碼來定義界面。2.代碼定義界面首先,在項目circleCal.h中添加如下加黑代碼。然后,在circleCal.cpp中編寫initUi()函數,以代碼構建程序界面。直接代碼開發實例3.關聯信號與槽本例在創建半徑輸入文本框和“計算”命令按鈕的代碼后面,都用語句設置了信號與槽的關聯,如下:leRadius=newQLineEdit(this); //創建半徑輸入文本框leRadius->setGeometry(140,40,113,21);connect(leRadius,SIGNAL(returnPressed()),this,SLOT(calCircle()));......pbCal=newQPushButton("計算",this); //創建“計算”命令按鈕pbCal->setGeometry(140,160,93,28);connect(pbCal,SIGNAL(clicked()),this,SLOT(calCircle()));在用代碼構建界面時,為使控件能響應用戶操作,必須用程序語句設置信號(控件接受的事件)與槽(功能函數)之間的關聯。信號與槽是Qt的核心機制,當信號發出時,與之連接的槽就會自動執行,設置信號槽關聯的語句一般形式為:connect(控件1,SIGNAL(信號1),控件2,SLOT(槽2/信號2));直接代碼開發實例4.功能開發最后,在circleCal.cpp中編寫實現圓面積計算的槽函數calCircle,代碼如下:voidDialog::calCircle(){boolok;QStringvalue=leRadius->text();intr=value.toInt(&ok);if(r>=0){floatlength=2*3.14159*r;doublearea=3.14159*r*r;leLength->setText(QString::number(length));leArea->setText(QString::number(area));}}QT5開發及實例(第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構造函數,來初始化一個QString字符串。其構造函數原型為:QT_ASCII_CAST_WARN_CONSTRUCTORQString::QString(constchar*str)被傳遞的constchar*類型的指針又將被QString::fromAscii()函數轉換為Unicode編碼。操作字符串(2)QString::append()函數具有與“+=”操作符同樣的功能,實現在一個字符串的末尾追加另一個字符串,例如:QStringstr1="Welcome";QStringstr2="to";str1.append(str2); //str1="Welcometo"str1.append("you!"); //str1="Welcometoyou!"(3)組合字符串的另一個函數是QString::sprintf(),此函數支持的格式定義符和C++庫中的函數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()函數,此函數的重載可以處理很多的數據類型。此外,一些重載具有額外的參數對字段的寬度、數字基數或者浮點數精度進行控制。通常,相對于QString::sprintf()函數,QString::arg()函數是一個比較好的解決方案,因為其類型安全,完全支持Unicode,并且允許改變"%n"參數的順序。例如:QStringstr;str=QString("%1wasbornin%2.").arg("John").arg(1998);//str="Johnwasbornin1998."(5)QString也提供了一些其他組合字符串的方法,包括如下幾種。①insert()函數:在原字符串特定的位置插入另一個字符串。②prepend()函數:在原字符串的開頭插入另一個字符串。③replace()函數:用指定的字符串代替原字符串中的某些字符。(6)很多時候,去掉一個字符串兩端的空白(空白字符包括回車字符“\n”、換行字符“\r”、制表符“\t”和空格字符“”等)非常有用,如獲取用戶輸入的賬號時。①QString::trimmed()函數:移除字符串兩端的空白字符。②QString::simplified()函數:移除字符串兩端的空白字符,使用單個空格字符“”代替字符串中出現的空白字符。例如:QStringstr="Welcome\tto\nyou!";str=str.trimmed(); //str="Welcome\tto\nyou!"02查詢字符串數據查詢字符串數據(1)QString::startsWith()函數判斷一個字符串是否以某個字符串開頭。此函數具有兩個參數。第一個參數指定了一個字符串,第二個參數指定是否大小寫敏感(默認情況下,是大小寫敏感的),例如:QStringstr="Welcometoyou!";str.startsWith("Welcome",Qt::CaseSensitive); //返回truestr.startsWith("you",Qt::CaseSensitive); //返回false(2)QString::endsWith()函數類似于QString::startsWith()函數,此函數判斷一個字符串是否以某個字符串結尾。(3)QString::contains()函數判斷一個指定的字符串是否出現過,例如:QStringstr="Welcometoyou!";str.contains("Welcome",Qt::CaseSensitive); //返回true查詢字符串數據(4)比較兩個字符串也是經常使用的功能,QString提供了多種比較手段。①operator<(constQString&):比較一個字符串是否小于另一個字符串。如果是,則返回true。②operator<=(constQString&):比較一個字符串是否小于等于另一個字符串。如果是,則返回true。③operator==(constQString&):比較兩個字符串是否相等。如果相等,則返回true。④operator>=(constQString&):比較一個字符串是否大于等于另一個字符串。如果是,則返回true。⑤localeAwareCompare(constQString&,constQString&):靜態函數,比較前后兩個字符串。⑥compare(constQString&,constQString&,Qt::CaseSensitivity):該函數可以指定是否進行大小寫的比較,而大小寫的比較是完全基于字符的Unicode編碼值的,而且是非常快的,返回值類似于localeAwareCompare()函數。03字符串的轉換字符串的轉換QString類提供了豐富的轉換函數,可以將一個字符串轉換為數值類型或者其他的字符編碼集。(1)QString::toInt()函數將字符串轉換為整型數值,類似的函數還有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提供的字符編碼集的轉換函數將會返回一個constchar*類型版本的QByteArray,即構造函數QByteArray(constchar*)構造的QByteArray對象。QByteArray類具有一個字節數組,它既可以存儲原始字節(rawbytes),也可以存儲傳統的以“\0”結尾的8位的字符串。在Qt中,使用QByteArray比使用constchar*更方便,且QByteArray也支持隱式共享。轉換函數有以下幾種。①toAscii():返回一個ASCII編碼的8位字符串。②toLatin1():返回一個Latin-1(ISO8859-1)編碼的8位字符串。③toUtf8():返回一個UTF-8編碼的8位字符串(UTF-8是ASCII碼的超集,它支持整個Unicode字符集)。④toLocal8Bit():返回一個系統本地(locale)編碼的8位字符串。字符串的轉換下面舉例說明其用法:QStringstr="Welcometoyou!"; //初始化一個字符串對象QByteArrayba=str.toAscii(); //(a)qDebug()<<ba; //(b)ba.append("Hello,World!"); //(c)qDebug()<<ba.data(); //輸出最后結果一個NULL字符串就是使用QString的默認構造函數或者使用“(constchar*)0”作為參數的構造函數創建的QString字符串對象;而一個空字符串是一個大小為0的字符串。一個NULL字符串一定是一個空字符串,而一個空字符串未必是一個NULL字符串。例如:QString().isNull(); //結果為trueQString().isEmpty(); //結果為trueQString("").isNull(); //結果為falseQString("").isEmpty(); //結果為trueQT5開發及實例(第5版)第2章Qt5模板庫、工具類及控件——容器類容器類這樣的數據類型包含了通常使用的大多數數據類型,包括基本數據類型(如int和double等)和Qt的一些數據類型(如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類經常使用的Qt容器類有QList、QLinkedList和QVector等。在開發一個較高性能需求的應用程序時,程序員會比較關注這些容器類的運行效率。表列出了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>是迄今為止最常用的容器類,它存儲給定數據類型T的一列數值。繼承自QList類的子類有QItemSelection、QQueue、QSignalSpy、QStringList和QTestEventList。QList不僅提供了可以在列表中進行追加的QList::append()和Qlist::prepend()函數,還提供了在列表中間完成插入操作的QList::insert()函數。相對于任何其他的Qt容器類,為了使可執行代碼盡可能少,QList被高度優化。QList<T>維護了一個指針數組,該數組存儲的指針指向QList<T>存儲的列表項的內容。因此,QList<T>提供了基于下標的快速訪問。QList類、QLinkedList類和QVector類對于不同的數據類型,QList<T>采取不同的存儲策略,存儲策略有以下幾種。(1)如果T是一個指針類型或指針大小的基本類型(即該基本類型占有的字節數和指針類型占有的字節數相同),QList<T>會將數值直接存儲在它的數組中。(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>是一個鏈式列表,它以非連續的內存塊保存數據。QLinkedList<T>不能使用下標,只能使用迭代器訪問它的數據項。與QList相比,當對一個很大的列表進行插入操作時,QLinkedList具有更高的效率。3.QVector類QVector<T>在相鄰的內存中存儲給定數據類型T的一組數值。在一個QVector的前部或者中間位置進行插入操作的速度是很慢的,這是因為這樣的操作將導致內存中的大量數據被移動,這是由QVector存儲數據的方式決定的。QVector<T>既可以使用下標訪問數據項,也可以使用迭代器訪問數據項。繼承自QVector類的子類有QPolygon、QPolygonF和QStack。QList類、QLinkedList類和QVector類4.Java風格迭代器遍歷容器Java風格迭代器同STL風格迭代器相比,使用起來更簡單方便,不過這也是以輕微的性能損耗為代價的。對于每一個容器類,Qt提供了兩種類型的Java風格迭代器數據類型,即只讀迭代器類和讀寫迭代器類,見表。容

類只讀迭代器類讀寫迭代器類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只讀遍歷方法。【例】(簡單)(CH201)通過控制臺程序實現QList只讀遍歷方法。其具體代碼如下:#include<QCoreApplication> #include<QDebug> //(a)intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv); //(b)QList<int>list; //創建一個QList<int>棧對象listlist<<1<<2<<3<<4<<5; //用操作運算符“<<”輸入五個整數QListIterator<int>i(list); //(c)for(;i.hasNext();) //(d)qDebug()<<i.next();returna.exec();}QList類、QLinkedList類和QVector類(2)QListIterator<T>是只讀迭代器,它不能完成列表項的插入和刪除操作。讀寫迭代器QMutableListIterator<T>除提供基本的遍歷操作(與QListIterator的操作相同)外,還提供了insert()插入操作函數、remove()刪除操作函數和修改數據函數等。【例】(簡單)(CH202)通過控制臺程序實現QList讀寫遍歷方法。具體代碼如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //創建一個空的列表list QMutableListIterator<int>i(list); //創建上述列表的讀寫迭代器 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風格迭代器數據類型:一種提供只讀訪問;另一種提供讀寫訪問。由于只讀類型的迭代器的運行速度要比讀寫迭代器的運行速度快,所以應盡可能地使用只讀類型的迭代器。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存儲的數據形式是一個鍵對應一個值,并且按照鍵Key的順序存儲數據。為了能夠支持一鍵多值的情況,QMap提供了QMap<Key,T>::insertMulti()和QMap<Key,T>::values()函數。存儲一鍵多值的數據時,也可以使用QMultiMap<Key,T>容器,它繼承自QMap。2.QHash類QHash<Key,T>具有與QMap幾乎完全相同的API。QHash維護著一張哈希表(HashTable),哈希表的大小與QHash的數據項的數目相適應。QHash以任意的順序組織它的數據。當存儲數據的順序無關緊要時,建議使用QHash作為存放數據的容器。QHash也可以存儲一鍵多值形式的數據,它的子類QMultiHash<Key,T>實現了一鍵多值的語義。QMap類和QHash類3.Java風格迭代器遍歷容器對于每一個容器類,Qt都提供了兩種類型的Java風格迭代器數據類型:一種提供只讀訪問;另一種提供讀寫訪問。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; //創建一個QMap棧對象 //向棧對象插入<城市,區號>對 map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMapIterator<QString,QString>i(map); //創建一個只讀迭代器 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風格迭代器數據類型:一種提供只讀訪問;另一種提供讀寫訪問。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風格迭代器的例子基本相同。不同的是,這里通過查找鍵來實現值的修改。具體代碼如下:#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開發及實例(第5版)第2章Qt5模板庫、工具類及控件——QVariant類QVariant類【例】(簡單)(CH206)QVariant類的用法。以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創建Qt項目,項目名myVariant,“ClassInformation”頁基類選“QWidget”。建好項目后,在widget.cpp文件中編寫代碼,具體內容。QT5開發及實例(第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()函數輸出所有的計算結果 qDebug()<<"qSwap(bn,cn):"<<"bn="<<bn<<"cn="<<cn; returna0.exec();}02基本的正則表達式基本的正則表達式正則表達式由表達式(expressions)、量詞(quantifiers)和斷言(assertions)組成。(1)最簡單的表達式是一個字符。字符集可以使用表達式如“[AEIOU]”,表示匹配所有的大寫元音字母;使用“[^AEIOU]”,表示匹配所有非元音字母,即輔音字母;連續的字符集可以使用表達式如“[a-z]”,表示匹配所有的小寫英文字母。(2)量詞說明表達式出現的次數,如“x[1,2]”表示“x”可以至少有一個,至多有兩個。在計算機語言中,標識符通常要求以字母或下畫線(也稱下畫線)開頭,后面可以是字母、數字和下畫線。滿足條件的標識符表示為:"[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開發及實例(第5版)第2章Qt5模板庫、工具類及控件——控

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

PushButton:按鈕。

ToolButton:工具按鈕。

RadioButton:單選按鈕。

CheckBox:復選框。

CommandLinkButton:命令鏈接按鈕。

DialogButtonBox:對話框按鈕盒。按鈕組(Buttons)【例】(簡單)(CH208)以QPushButton為例介紹按鈕的用法。(1)以“直接編寫代碼”(即取消勾選“Generateform”復選框)方式創建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:數字顯示框(自旋盒)。

DoubleSpinBox:雙自旋盒。

TimeEdit:時間編輯。

DateEdit:日期編輯。

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

Dial:撥號。

HorizontalScrollBar:橫向滾動條。

VerticalScrollBar:垂直滾動條。

HorizontalSlider:橫向滑塊。

VerticalSlider:垂直滑塊。

KeySequenceEdit:按鍵序列編輯框。輸入部件組(InputWidgets)1.QDateTime類Date/TimeEdit對應于QDateTime類,在Qt5中可以使用它來獲得系統時間。通過QDateTime::currentDateTime()來獲取本地系統的時間和日期信息。可以通過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()));即定時時間一到就會發送timeout()信號,從而觸發slottimedone()槽去完成某件事情。(3)開啟定時器,并設定定時周期。定時器定時有兩種方式:start(inttime)和setSingleShot(true)。其中,start(inttime)表示每隔“time”秒就會重啟定時器,可以重復觸發定時,利用stop()將定時器關掉;而setSingleShot(true)則是僅啟動定時器一次。工程中常用的是前者,例如:time_clock->start(2000);03顯示控件組(DisplayWidgets)1.GraphicsView2.TextBrowser3.QQuickWidget顯示控件組(DisplayWidgets)顯示控件組(DisplayWidgets)如圖。顯示控件組(DisplayWidgets)中各個控件的名稱依次解釋如下。

Label:標簽。

TextBrowser:文本瀏覽器。

GraphicsView:圖形視圖。

CalendarWidget:日歷。

LCDNumber:液晶數字。

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傳統QWidget程序可以用它來嵌入QML代碼,為Qt開發者將桌面應用遷移到QtQuick提供了方便,但目前在QML中尚不能嵌入其他非QML窗口,因為QML的渲染機制和QWidget的是不一樣的。04空間間隔組(Spacers)空間間隔組(Spacers)空間間隔組(Spacers)如圖。空間間隔組(Spacers)中各個控件的名稱依次解釋如下。

HorizontalSpacer:水平間隔。

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

GroupBox:組框。

ScrollArea:滾動區域。

ToolBox:工具箱。

TabWidget:標簽小部件。

StackedWidget:堆疊部件。

Frame:幀。

Widget:小部件。

MDIArea:MDI區域。

DockWidget:停靠窗體部件。

QAxWidget:封裝Flash的ActiveX控件。容器組(Containers)1.創建窗口如果Widget未使用父級進行創建,則在顯示時視為窗口或頂層Widget。由于頂層Widget沒有父級對象類來確保在其不再被使用時就被刪除,所以需要開發人員在應用程序中對其進行跟蹤。例如,使用QWidget創建和顯示具有默認大小的窗口: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

溫馨提示

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

評論

0/150

提交評論