Qt开发入门
Qt的初步研究
目錄
一、Qt基本情況的介紹... 3
1、歷史... 3
2、基本介紹... 3
二、Qt開(kāi)發(fā)準(zhǔn)備... 4
1、Qt的開(kāi)發(fā)環(huán)境及搭建... 4
1.1、開(kāi)發(fā)環(huán)境... 4
1.2、Qt Library + Qt Creator. 4
1.2.1、安裝包... 4
1.2.2、安裝... 5
1.2.3、配置... 6
1.2.4、新建項(xiàng)目... 13
1.2.5、編譯測(cè)試... 17
1.3、VS+Qt插件(還有問(wèn)題沒(méi)解決)... 17
1.3.1、安裝包... 17
1.3.2、安裝... 18
1.3.3、配置... 18
1.3.4、新建項(xiàng)目... 22
1.3.5、編譯測(cè)試(編譯沒(méi)通過(guò),可能配置不正確)... 24
1.4、小結(jié)... 26
2、系統(tǒng)庫(kù)的使用及程序發(fā)布... 26
2.1、系統(tǒng)API的使用... 26
2.2、庫(kù)的添加... 27
2.2.1、只對(duì)本項(xiàng)目起作用的庫(kù)的添加... 27
2.2.2、公共庫(kù)的添加(測(cè)試沒(méi)通過(guò))... 30
2.3、靜態(tài)編譯與動(dòng)態(tài)編譯(靜態(tài)編譯沒(méi)實(shí)踐檢驗(yàn))... 31
3、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)... 31
3.1、靜態(tài)庫(kù)的創(chuàng)建和使用... 32
3.1.1、靜態(tài)庫(kù)的創(chuàng)建... 32
3.1.2、靜態(tài)庫(kù)的使用... 36
3.2、動(dòng)態(tài)庫(kù)的創(chuàng)建和使用... 39
3.2.1、動(dòng)態(tài)庫(kù)的創(chuàng)建... 39
3.2.2、動(dòng)態(tài)庫(kù)的使用... 41
3.3、小結(jié)... 43
4、Qt程序的跨平臺(tái)移植... 44
4.1、Qt的跨平臺(tái)... 44
4.2、移植方法... 44
4.3、移植時(shí)應(yīng)注意的問(wèn)題... 44
5、版本不兼容常見(jiàn)問(wèn)題... 45
三、Qt界面庫(kù)基本的開(kāi)發(fā)過(guò)程,基本的控件... 45
1、????? helloworld例子... 46
2、可視化編程介紹... 52
3、常用控件的常見(jiàn)接口... 54
1.1、Layouts和spacers. 54
1.2、label ----靜態(tài)文本框... 55
1.3、PushButton----按鈕... 55
1.4、CheckBox----復(fù)選框... 56
1.5、listWidget----列表... 56
1.6、tableWidget----表格... 57
1.7、treeWidget----樹(shù)... 57
1.8、progressBar----進(jìn)度條... 58
1.9、comboBox----組合下拉框... 59
1.10 QmessageBox----消息提示盒... 59
1.11 QFileDialog----文件選擇框... 61
1.12 QSystemTrayIcon----托盤(pán)類(lèi)... 63
1.13 QThread----線程類(lèi)... 63
1.14 線程和信號(hào)-槽用法舉例... 64
四、QtWebkit的使用... 65
?
?
一、Qt基本情況的介紹
1、歷史
HaavardNord和Eirik Chambe-Eng于1991年開(kāi)始開(kāi)發(fā)"Qt",1994年3月4日創(chuàng)立公司,最早名為Quasar Technologies,然后更名為T(mén)roll Tech,然后再改為T(mén)rolltech,中文名是“奇趣科技”,2008年6月17日被NOKIA公司收購(gòu),以增強(qiáng)該公司在跨平臺(tái)軟件研發(fā)方面的實(shí)力,更名Qt Software。
該工具包名為Qt是因?yàn)樽帜窺在Haavard的Emacs字體特別漂亮,而“t”代表“toolkit”,靈感來(lái)自Xt,X toolkit。
2009年5月11日,諾基亞Qt Software宣布Qt源代碼管理系統(tǒng)面向公眾開(kāi)放,Qt開(kāi)發(fā)人員可通過(guò)為Qt以及與 Qt相關(guān)的項(xiàng)目貢獻(xiàn)代碼、翻譯、示例以及其他內(nèi)容,協(xié)助引導(dǎo)和塑造Qt未來(lái)的發(fā)展。為了便于這些內(nèi)容的管理,Qt Software啟用了基于Git和Gitorious開(kāi)源項(xiàng)目的Web源代碼管理系統(tǒng)。
在推出開(kāi)放式Qt代碼庫(kù)的同時(shí),Qt Software在其網(wǎng)站發(fā)布了其產(chǎn)品規(guī)劃(Roadmap)。其中概述了研發(fā)項(xiàng)目中的最新功能,展現(xiàn)了現(xiàn)階段對(duì)Qt 未來(lái)發(fā)展方向的觀點(diǎn),以期鼓勵(lì)社區(qū)提供反饋和貢獻(xiàn)代碼,共同引導(dǎo)和塑造Qt的未來(lái)。 2012年8月9日,Digia宣布已完成對(duì)諾基亞Qt業(yè)務(wù)及軟件技術(shù)的全面收購(gòu),并計(jì)劃將Qt應(yīng)用到Android、iOS及Windows 8平臺(tái)上。
2、基本介紹
平臺(tái)的C++應(yīng)用程序開(kāi)發(fā)框架。廣泛用于開(kāi)發(fā)GUI程序,這種情況下又被稱為部件工具箱。也可用于開(kāi)發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt使用于OPIE、Skype、VLC mediaplayer、Adobe Photoshop Elements、VirtualBox 與 Mathematica以及被Autodesk、歐洲空間局、夢(mèng)工廠、Google、HP、KDE、盧卡斯影業(yè)、西門(mén)子公司、富豪集團(tuán), 華特迪士尼動(dòng)畫(huà)制作公司、三星集團(tuán)、飛利浦、Panasonic所使用。
它是諾基亞(Nokia)的Qt Development Frameworks部門(mén)的產(chǎn)品。Qt使用標(biāo)準(zhǔn)的C++。通過(guò)語(yǔ)言綁定,其他的編程語(yǔ)言也可以使用Qt。
Qt是自由且開(kāi)放源代碼的軟件,在GNU較寬松公共許可證條款下發(fā)布。所有版本都支持廣泛的編譯器,包括GCC的C++編譯器和Visual Studio。
?
維基百科:http://zh.wikipedia.org/zh-cn/Qt
淺析 Qt 界面庫(kù):http://mobile.51cto.com/symbian-270393.htm
Qt官網(wǎng):http://qt.digia.com/
http://download.qt-project.org/archive/
Qt 項(xiàng)目:http://qt-project.org
Qt開(kāi)發(fā)者社區(qū):http://qt.csdn.net/
二、Qt開(kāi)發(fā)準(zhǔn)備
本部分是基于Qt5.0,1進(jìn)行研究的,期間會(huì)偶有提及Qt5.0.2的一些功能更新。
1、Qt的開(kāi)發(fā)環(huán)境及搭建
1.1、開(kāi)發(fā)環(huán)境
?(1)各平臺(tái)常用開(kāi)發(fā)環(huán)境
1、windows: QtLibrary + Qt Creator
QtLibrary + VS200X(X = 5,8,10…)
2、linux:? Qt Library + Qt Creator
3、mac:??? Qt Library + Qt Creator
?
(2) Qt Library是一個(gè)Qt庫(kù),包含編譯器,各種鏈接庫(kù)。
(3) Qt Creator 是一款跨平臺(tái)的集成開(kāi)發(fā)環(huán)境(Qt IDE),特別針對(duì)Qt開(kāi)發(fā)者,是Qt SDK組成的一部分,可運(yùn)行于Windows, Linux/X11 and Mac OS X等桌面操作系統(tǒng),允許開(kāi)發(fā)者為多桌面環(huán)境及移動(dòng)設(shè)備平臺(tái)創(chuàng)建應(yīng)用程序。它包括一個(gè)可視化偵錯(cuò)工具和整合的 GUI 版面和外形設(shè)計(jì)師。這個(gè)編輯器的功能包括語(yǔ)法高亮度顯示和自動(dòng)完成。Qt Creator 在 Linux 上,使用 GCC 的 C++ 編譯器。在 Windows,默認(rèn)安裝它可以使用 MinGW 或 MSVC。從源代碼編譯時(shí),也可以使用 cdb。
?
Qt Library + VS200X對(duì)VS老用戶用起來(lái)更順手,Qt Library + Qt Creator更適合跨平臺(tái)開(kāi)發(fā),因?yàn)镼t Creator就是一個(gè)跨平臺(tái)的開(kāi)發(fā)工具。
?
1.2、Qt Library + QtCreator
1.2.1、安裝包
(1)常用系統(tǒng)對(duì)應(yīng)的安裝包
集成包:(QtLibrary + Qt Creator)
·????????Linux 32-bit:Qt 5.0.1 for Linux 32-bit (388 MB)???
·????????Linux 64-bit:Qt 5.0.1 for Linux 64-bit (388 MB)
·????????Mac 64-bit: Qt 5.0.1 for Mac (398 MB)
·????????Mac 32-bit: Mac OS X 10.0以后的系統(tǒng)均為64bit的,Qt 5.0.1沒(méi)有32bit的
·????????Win32:Qt 5.0.1 for Windows 32-bit (MinGW 4.7,823 MB)
·????????Win32:Qt 5.0.1 for Windows 32-bit (VS 2010, 481MB)
Win64:5.0.2開(kāi)始發(fā)布64bit版本Qt 5.0.2 for Windows 64-bit (VS 2012, 500 MB)
?
以上是時(shí)至2013年4月2日最新的Qt安裝包,想了解最新安裝包信息請(qǐng)到http://qt-project.org/downloads 查看。
4月11日發(fā)布了5.0.2版本,增加了兩個(gè)安裝包:
·????????Qt5.0.2 for Windows 32-bit (VS 2010, OpenGL, 476 MB)?
·????????Qt5.0.2 for Windows 64-bit (VS 2012, 500 MB)?
?
(2)關(guān)于安裝包的說(shuō)明
1、選包建議
建議多少位的系統(tǒng)就安裝多少位的安裝包,要開(kāi)發(fā)多少位的程序就在多少位的系統(tǒng)上開(kāi)發(fā),這也有利于程序的調(diào)試。Qt Creator的宗旨就是方便跨平臺(tái)和跨系統(tǒng),所以程序從32位遷移到64位也應(yīng)當(dāng)不會(huì)很復(fù)雜,大概是源代碼的重新編譯吧。(詳細(xì)報(bào)告見(jiàn)《Qt安裝及編譯測(cè)試錯(cuò)誤報(bào)告4_12.docx》)
2、win32下MinGW包和Msvc包的區(qū)別
MinGW(Minimalist GNU for Windows),又稱mingw32,是將GCC編譯器和GNUBinutils移植到Win32平臺(tái)下的產(chǎn)物,包括一系列頭文件(Win32API)、庫(kù)和可執(zhí)行文件。另有mingw64系列工具,是用于產(chǎn)生64位Windows可執(zhí)行文件的GNU交叉編譯器。對(duì)于C語(yǔ)言之外的語(yǔ)言,MinGW使用標(biāo)準(zhǔn)的GNU運(yùn)行庫(kù),如C++使用GNU libstdc++。但是MinGW使用Windows中的C運(yùn)行庫(kù)。因此用MinGW開(kāi)發(fā)的程序不需要額外的第三方DLL支持就可以直接在Windows下運(yùn)行,而且也不一定必須遵從GPL許可證。這同時(shí)造成了MinGW開(kāi)發(fā)的程序只能使用Win32API和跨平臺(tái)的第三方庫(kù),而缺少POSIX支持,大多數(shù)GNU軟件無(wú)法在不修改源代碼的情況下用MinGW編譯。
Msvc:Microsoft Visual C++的簡(jiǎn)稱。
MinGW安裝包自帶MinGW 32bit編譯器,對(duì)系統(tǒng)的依賴程度較低;Msvc包不帶編譯器,使用的是MSVC編譯器,要求系統(tǒng)安裝VS2010或以上版本,安裝包較小。所以這兩個(gè)安裝包使用的編譯器是不一樣的,也可能導(dǎo)致語(yǔ)法等存在一定的差異,暫無(wú)優(yōu)劣之分,看個(gè)人情況而定。
1.2.2、安裝
(1)安裝步驟
1、運(yùn)行安裝包。直接雙擊安裝包即可,在linux下雙擊安裝包有時(shí)可能沒(méi)響應(yīng),那是因?yàn)榘惭b包沒(méi)運(yùn)行權(quán)限,可以通過(guò)下面的方法獲取運(yùn)行權(quán)限:
在終端輸入以下命令:(假設(shè)安裝包在桌面,XXX為安裝包名稱)
cd Desktop?????? //進(jìn)入文件目錄
chmod +x XXX.run??? //修改權(quán)限,chmod是加權(quán)限命令,+ 表示增加權(quán)限,x 表示可執(zhí)行
2、在彈出的安裝引導(dǎo)中選擇“next”,選擇安裝路徑后選“next”。
3、在“組件選擇”中可以選擇性安裝你需要的組件,選中組件時(shí)右邊會(huì)有說(shuō)明,默認(rèn)選項(xiàng)可以滿足正常開(kāi)發(fā)需求,但為了不時(shí)之需,可以全選。選好后點(diǎn)擊“next”。
4、在“許可協(xié)議”中主要說(shuō)明一些協(xié)議,同意后選“next”,在新界面中選擇創(chuàng)建快捷鍵的位置,然后一直選“next”,直到完成。
?
(2)Qt Creator各包安裝情況:
| 32bit安裝裝包 | 64bit安裝包 | VS200X插件 | ||
|
| MinGW | MSVC |
|
|
| windows32 | 安裝成功 | 安裝成功 | 新發(fā)布沒(méi)嘗試 | 安裝成功 |
| windows64 | 暫無(wú)條件測(cè)試 | 暫無(wú)條件測(cè)試 | 暫無(wú)條件測(cè)試 | 暫無(wú)條件測(cè)試 |
| linux32 | 安裝成功 | 沒(méi)嘗試 | 無(wú) | |
| linux64 | 不成功 | 安裝成功 | 無(wú) | |
| mac | 無(wú) | 安裝成功 | 無(wú) | |
1.2.3、配置
在一般情況下,Qt Creator會(huì)按默認(rèn)配置好,但有時(shí)可能需要我們做一些手動(dòng)配置,下面講解一下幾個(gè)常見(jiàn)配置(各平臺(tái)上Qt Creator的界面及用法是一樣的,此處以Qt Creator2.6.2(win32中文版)為例進(jìn)行說(shuō)明):
(1)“Qt 版本”與“編譯器”的配置
兩者的添加方法基本相同,不同的是“Qt版本”添加的是“qmake.exe”的路徑,“編譯器”添加的是編譯器(gcc.exe,vcvarsall)路徑。下面以添加“編譯器”為例:
1、在頂部菜單欄選擇“工具”->“選項(xiàng)”:
?
2、選擇“構(gòu)建和運(yùn)行”->“編譯器”,在右邊的“添加”中選擇要添加的編譯器類(lèi)型;
3、通過(guò)編譯器路徑后面的“瀏覽”按鈕,找到“編譯器文件(如gcc.exe)”,打開(kāi);
4、在“手動(dòng)設(shè)置”下面會(huì)看到新增的編譯器名稱(可自己命名),在編譯器路徑里可以看到新增的編譯器所在路徑,點(diǎn)擊“應(yīng)用”完成添加。
?
(2)調(diào)試器的配置
在linux和mac上,Qt Creator可以自動(dòng)檢測(cè)到合適的調(diào)試器(應(yīng)該是安裝包綁定的),但在windows上,Qt Creator默認(rèn)是不適用調(diào)試器的,需要手動(dòng)配置,而且mingw與msvc的調(diào)試器也似乎是不匹配的(測(cè)試結(jié)果:msvc用mingw調(diào)試器時(shí)斷點(diǎn)處沒(méi)停也查看不到值的變化; mingw用msvc調(diào)試器時(shí)運(yùn)行得很慢很慢很慢),手動(dòng)配置如下:
1、mingw-32bit
a、在調(diào)試器后面的“管理”選擇“編輯”
?
b、選擇“GDB”,點(diǎn)擊“瀏覽”
?
C、找到“gdb.exe”,文件路徑為“…\MinQt5.0.1\Tools\MinGW\bin”
?
d、“確定”->“應(yīng)用”。
?
2、msvc-32bit
a、? 自身不帶有調(diào)試器,需要到網(wǎng)上下載:(windbg)
http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi?
?
b、? 安裝“WinDbg”后,點(diǎn)擊“管理”->“自動(dòng)檢測(cè)”即可,如無(wú)法檢測(cè)到,也可按mingw的步驟手動(dòng)添加。
?
(3)“構(gòu)建套件(Kit)”的配置
1、在頂部菜單欄選擇“工具”->“選項(xiàng)”:
?
2、選擇“構(gòu)建和運(yùn)行”->“構(gòu)建套件(Kit)”,Qt Creator會(huì)自動(dòng)檢測(cè)到安裝包自帶的默認(rèn)套件
3、可以通過(guò)右邊的“添加”來(lái)創(chuàng)建自己想要的Kit。在“名稱”項(xiàng)命名,命名沒(méi)特殊要求,最好能體現(xiàn)該“kit”的屬性;在“編譯器”和“Qt版本”中選擇自己需要的選項(xiàng);在“設(shè)備類(lèi)型”選擇程序運(yùn)行的設(shè)備,電腦上一般默認(rèn)“桌面”。不匹配時(shí)會(huì)有或 錯(cuò)誤提醒和警告,添加的“kit”會(huì)在“手動(dòng)設(shè)置”顯示??梢酝ㄟ^(guò)“設(shè)為默認(rèn)”把其中某個(gè)“kit”設(shè)為默認(rèn),設(shè)為默認(rèn)后,在打開(kāi)工程和修改工程“kit”時(shí)會(huì)自動(dòng)勾選。
?
4、新建項(xiàng)目時(shí),根據(jù)需要選擇相應(yīng)的“Kit”,默認(rèn)情況下為全選。
?
5、查看工程使用的“Kit”。把鼠標(biāo)移至或點(diǎn)擊界面左下角的電腦圖標(biāo)
?
6、修改項(xiàng)目的“Kit”。
A、點(diǎn)擊左側(cè)菜單中的“項(xiàng)目”,選擇“構(gòu)建和運(yùn)行”,點(diǎn)擊“-”減號(hào)刪除當(dāng)前“Kit”:
?
B、在彈出的窗口下選擇新“kit”,點(diǎn)擊“配置項(xiàng)目”即可。
1.2.4、新建項(xiàng)目
(1)點(diǎn)擊“create Project”
?
(2)選擇項(xiàng)目及應(yīng)用類(lèi)型
?
(3)項(xiàng)目命名,指定創(chuàng)建路徑,注意路徑不要出現(xiàn)中文
?
(4)選擇構(gòu)建套件,可根據(jù)需要勾選,默認(rèn)為全選
?
(5)選擇基類(lèi)類(lèi)型,“下一步”->“完成”
QT中QWidget、QDialog及QMainWindow的區(qū)別(來(lái)源:http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html)
QWidget類(lèi)是所有用戶界面對(duì)象的基類(lèi)。 窗口部件是用戶界面的一個(gè)基本單元:它從窗口系統(tǒng)接收鼠標(biāo)、鍵盤(pán)和其它事件,并且在屏幕上繪制自己。每一個(gè)窗口部件都是矩形的,并且它們按Z軸順序排列。一個(gè)窗口部件可以被它的父窗口部件或者它前面的窗口部件蓋住一部分。
???QMainWindow 類(lèi)提供一個(gè)有菜單條、錨接窗口(例如工具條)和一個(gè)狀態(tài)條的主應(yīng)用程序窗口。主窗口通常用在提供一個(gè)大的中央窗口部件(例如文本編輯或者繪制畫(huà)布)以及周?chē)藛巍⒐ぞ邨l和一個(gè)狀態(tài)條。QMainWindow常常被繼承,因?yàn)檫@使得封裝中央部件、菜單和工具條以及窗口狀態(tài)條變得更容易,當(dāng)用戶點(diǎn)擊菜單項(xiàng)或者工具條按鈕時(shí),槽會(huì)被調(diào)用。
???QDialog類(lèi)是對(duì)話框窗口的基類(lèi)。對(duì)話框窗口是主要用于短期任務(wù)以及和用戶進(jìn)行簡(jiǎn)要通訊的頂級(jí)窗口。QDialog可以是模態(tài)對(duì)話框也可以是非模態(tài)對(duì)話框。QDialog支持?jǐn)U展性并且可以提供返回值。它們可以有默認(rèn)按鈕。QDialog也可以有一個(gè)QSizeGrip在它的右下角,使用setSizeGripEnabled()。
???QDialog 是最普通的頂級(jí)窗口。一個(gè)不會(huì)被嵌入到父窗口部件的窗口部件叫做頂級(jí)窗口部件。通常情況下,頂級(jí)窗口部件是有框架和標(biāo)題欄的窗口(盡管使用了一定的窗口部件標(biāo)記,創(chuàng)建頂級(jí)窗口部件時(shí)也可能沒(méi)有這些裝飾。)在Qt中,QMainWindow和不同的QDialog的子類(lèi)是最普通的頂級(jí)窗口。
??? 如果是頂級(jí)對(duì)話框,那就基于QDialog創(chuàng)建,如果是主窗體,那就基于QMainWindow,如果不確定,或者有可能作為頂級(jí)窗體,或有可能嵌入到其他窗體中,則基于QWidget創(chuàng)建。
??? 當(dāng)然了,實(shí)際中,你還可以基于任何其他部件類(lèi)來(lái)派生??磳?shí)際需求了,比如QFrame、QStackedWidget等等。
?
(6)點(diǎn)擊“錘子”圖標(biāo)編譯,點(diǎn)擊“綠色箭頭”運(yùn)行
1.2.5、編譯測(cè)試
(1)選擇默認(rèn)“kit”編譯(編譯器、Qt版本的位數(shù)與系統(tǒng)位數(shù)相同)
1、mac和windows上,編譯通過(guò),程序運(yùn)行正常;
2、linux下初次編譯可能會(huì)報(bào)錯(cuò):cannot find –lGL;
解決辦法:在終端輸入sudo apt-getinstall libgl1-mesa-dev下載相應(yīng)的文件。
(2)同一系統(tǒng)下是否同時(shí)支持編譯32bit和64bit的程序
經(jīng)測(cè)試,初步得出結(jié)論:32bit系統(tǒng)下不支持編譯64bit程序;mac-64bit系統(tǒng)下可以編譯32bit程序;linux-64bit系統(tǒng)下編譯不了32bit程序,猜測(cè)是系統(tǒng)缺少32位庫(kù)文件。(詳細(xì)情況請(qǐng)查看《Qt安裝及編譯測(cè)試錯(cuò)誤報(bào)告》):
1.3、VS+Qt插件(還有問(wèn)題沒(méi)解決)
1.3.1、安裝包
插件包:Qt Library + VS200X(X = 5,8,10…本文以VS2010為例進(jìn)行說(shuō)明)
Qt Library在官網(wǎng)上沒(méi)有Qt5SDK單獨(dú)的包,均捆包在Qt Creator集成包里,可通過(guò)安裝Qt Creator集成包獲取。
·????????Visual Studio Add-in 1.2.0 for Qt5? (VS插件)
?
1.3.2、安裝
(1)安裝步驟
1、安裝VS2005或以上版本。安裝比較簡(jiǎn)單,基本是“安裝”->“完成”的自動(dòng)模式。
2、安裝Qt的SDK。雙擊即可安裝,官網(wǎng)上暫無(wú)發(fā)現(xiàn)單獨(dú)的Qt5 SDK,都集成到了Qt Creator安裝包里面了,可以通過(guò)安裝Qt Creator安裝包獲取其SDK(但需手動(dòng)設(shè)置路徑,下面會(huì)說(shuō))。
3、安裝Visual Studio Add-in。雙擊即可安裝,安裝完成后,VS菜單上會(huì)多出一個(gè)“Qt”選項(xiàng)。
?
參考網(wǎng)址:
http://www.cnblogs.com/qq78292959/archive/2012/05/03/2481971.html
1.3.3、配置
(1)配置步驟
1、啟動(dòng)VS,點(diǎn)擊“Qt”->“Options”進(jìn)行路徑設(shè)置。
?
2、VS可以自動(dòng)檢測(cè)到并添加單獨(dú)安裝的Qt SDK路徑,如下所示:
?
3、但使用集成到QtCreator的SDK則需要手動(dòng)添加路徑,如下所示:
?
4、找到bin路徑,“確定”->“ok”:
?
5、路徑設(shè)置不正確時(shí),有紅字提醒并且“ok”按鈕無(wú)效:
?
6、點(diǎn)擊“OK”完成設(shè)置。
?
(2)配置問(wèn)題導(dǎo)致的常見(jiàn)錯(cuò)誤
???????? 1、Visual Studio Add-in與Qt SDK版本要匹配,不能添加比自身對(duì)應(yīng)版本高的SDK。否則會(huì)報(bào)錯(cuò):
1.3.4、新建項(xiàng)目
(1)“文件”->“新建”->“項(xiàng)目”
?
(2)選擇項(xiàng)目種類(lèi),命名項(xiàng)目并指定路徑
?
(3)在彈出的界面中直接點(diǎn)擊“下一步”,選擇需要的模塊
?
(4)設(shè)置基類(lèi)等,完成
(5)生成解決方案,啟動(dòng)
1.3.5、編譯測(cè)試(編譯沒(méi)通過(guò),可能配置不正確)
(1)win32編譯,報(bào)錯(cuò):
1>------ 已啟動(dòng)生成: 項(xiàng)目: VSQt5, 配置: Debug Win32 ------
1>Rcc'ing vsqt5.qrc...
1>RCC Parse Error: 'd:\Qt+Creator\VSQt5\VSQt5\vsqt5.qrc'Line: 1 Column: 1 [Encountered incorrectly encoded content.]
1>Project : error PRJ0019: 某個(gè)工具從以下位置返回了錯(cuò)誤代碼: "Rcc'ingvsqt5.qrc..."
1>生成日志保存在“file://D:\Qt+Creator\VSQt5\Win32\Debug\BuildLog.htm”
1>VSQt5 - 1 個(gè)錯(cuò)誤,個(gè)警告
========== 生成: 成功0 個(gè),失敗1 個(gè),最新0 個(gè),跳過(guò)0 個(gè)==========
?
解決辦法:尚未解決,根據(jù)報(bào)錯(cuò)是在RCC解析vsqt5.qrc文件時(shí),遇到不正確的編碼內(nèi)容。對(duì)此做了進(jìn)一步測(cè)試:
?
1、VS無(wú).qrc文件的項(xiàng)目測(cè)試
建Qt Console Application(Qt5)項(xiàng)目,源碼,文件,結(jié)果如下:
編譯通過(guò),運(yùn)行正常,所以驗(yàn)證了的確跟.qrc文件有關(guān)。
?
2、在VS與Qt Creator里建同樣的工程,嘗試通過(guò)對(duì)比.qrc文件發(fā)現(xiàn)錯(cuò)誤的編碼內(nèi)容,但Qt Creator建的項(xiàng)目沒(méi)有.qrc文件
A、有.qrc文件的項(xiàng)目測(cè)試:
建Qt Application(Qt5)項(xiàng)目,其中基類(lèi)為:QMainWindow;源碼,文件,結(jié)果如下:
?
曾懷疑跟下面文件的紅色提示有關(guān),但網(wǎng)上的例子也是一樣的截圖。
?
B、 建同樣的工程,Qt Creator目錄沒(méi)有.qrc文件
3、網(wǎng)上下載別人VS開(kāi)發(fā)的Qt程序源碼,看看重新編譯后是否能通過(guò),對(duì)比.qrc文件是否不一樣。(該部分暫時(shí)還沒(méi)做)
(2)x64b編譯,報(bào)錯(cuò):
?
原因猜測(cè):沒(méi)有64位的庫(kù)文件和連接器等,插件不支持64位編譯。
?
1.4、小結(jié)
???????? 在Qt Creator上的搭建是成功的,在VS上插件的安裝配置遇到了問(wèn)題,但可以知道的是VS上用目前的32bit的SDK也同樣無(wú)法編譯64位程序的,而且VS僅限于windows系統(tǒng)。綜上,我們可以選擇Qt Creator進(jìn)行Qt的開(kāi)發(fā)。
?
2、系統(tǒng)庫(kù)的使用及程序發(fā)布
2.1、系統(tǒng)API的使用
可以通過(guò)包含相應(yīng)頭文件來(lái)直接使用API函數(shù),如:
此外,外部的文件通過(guò)“添加現(xiàn)有文件”,再#include即可使用,跟在MFC上使用沒(méi)多大區(qū)別。
?
2.2、庫(kù)的添加
2.2.1、只對(duì)本項(xiàng)目起作用的庫(kù)的添加
Qt Creator可以把庫(kù)添加到具體項(xiàng)目的屬性,添加后只對(duì)本項(xiàng)目起作用,不影響其他項(xiàng)目,下面以Qt Creator-msvc添加“外部庫(kù)”為例講解如何添加庫(kù)文件:
(1)右鍵要添加庫(kù)的目標(biāo)項(xiàng)目->“添加庫(kù)”
?
(2)選擇要添加庫(kù)的類(lèi)型,此處會(huì)有各類(lèi)型庫(kù)的說(shuō)明
?
(3)勾選對(duì)應(yīng)的“平臺(tái)”和“鏈接”,通過(guò)“瀏覽”獲取“庫(kù)文件”路徑以及“包含文件”路徑,注意的是選“庫(kù)文件”時(shí)自動(dòng)添加的“包含路徑”不一定是正確的,應(yīng)填寫(xiě)該庫(kù)頭文件的實(shí)際路徑。
值得注意的是:在windows下以這種方式導(dǎo)入的庫(kù)文件必須是.lib后綴,因?yàn)樵谖募x擇對(duì)話框里已經(jīng)把文件類(lèi)型限制為(*.lib),而QtCreator-mingw生成的靜態(tài)庫(kù)是.a后綴的。
?
(4)在完成前會(huì)有匯總顯示
?
(5)在導(dǎo)入完成后,會(huì)根據(jù)匯總做相應(yīng)的修改,一般為在.pro添加相應(yīng)的路徑信息,此時(shí)可以通過(guò)#include相應(yīng)的頭文件來(lái)使用庫(kù)函數(shù)
2.2.2、公共庫(kù)的添加(測(cè)試沒(méi)通過(guò))
參考網(wǎng)址:http://qt.csdn.net/articles.aspx?pointid=264&pointid2=
點(diǎn)擊主界面左邊菜單的“項(xiàng)目”->“構(gòu)建和運(yùn)行”,打開(kāi)下方的“構(gòu)建環(huán)境”->“詳情”,可以看到QtCreator對(duì)環(huán)境變量的使用情況:
從紅色框里的INCLUDE,LIB和LIBPATH,我們可以看出,Qt Creator是通過(guò)這三個(gè)環(huán)境變量的路徑找到相應(yīng)的系統(tǒng)庫(kù)文件的,所以理論上我們可以通過(guò)在這三個(gè)環(huán)境變量里添加相應(yīng)的文件路徑來(lái)達(dá)到添加“公共庫(kù)”的目的。但在嘗試中發(fā)現(xiàn),如果在這里修改這三個(gè)環(huán)境變量,新增的路徑只對(duì)本項(xiàng)目有用,并不影響到其他項(xiàng)目。要實(shí)現(xiàn)真正意義上的“公共庫(kù)”,需要到“我的電腦”->“屬性”里修改這三個(gè)環(huán)境變量。
在實(shí)際操作中遇到下面的問(wèn)題沒(méi)解決:
設(shè)置環(huán)境變量后,包含頭文件,使用Lib里面的函數(shù)時(shí)報(bào)錯(cuò):
2.3、靜態(tài)編譯與動(dòng)態(tài)編譯(靜態(tài)編譯沒(méi)實(shí)踐檢驗(yàn))
QtCreator開(kāi)發(fā)的程序可以通過(guò)以下兩種方法發(fā)布到?jīng)]Qt庫(kù)的電腦:
1、靜態(tài)編譯
可參考:
http://blog.csdn.net/c154387417/article/details/6330245
官網(wǎng)發(fā)布的安裝包在默認(rèn)情況下是動(dòng)態(tài)編譯的,而且沒(méi)有靜態(tài)編譯所需的Qt庫(kù),據(jù)網(wǎng)上所說(shuō)要靜態(tài)編譯需先自己編譯出靜態(tài)編譯所需的Qt庫(kù),然后在project.pro添加QMAKE_LFLAGS=-static指定為靜態(tài)編譯即可。由于編譯所需時(shí)間太長(zhǎng)(據(jù)說(shuō)好幾小時(shí)),暫時(shí)尚未嘗試。
2、復(fù)制運(yùn)行時(shí)提示缺少的dll文件到當(dāng)前目錄,可參考:(win32下測(cè)試通過(guò))
http://hi.baidu.com/dbzhang800/item/5c92691dc965017a7a5f2542
有一個(gè)dll(debug模式下為:libEGLd.dll;release模式下位:libEGL.dll)需特別注意的,缺少時(shí)并不會(huì)提示,debug編譯的exe運(yùn)行時(shí)直接報(bào)錯(cuò):
release編譯的exe缺少時(shí)點(diǎn)擊沒(méi)反應(yīng)。
?
3、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
參考: QT 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)http://mobile.51cto.com/symbian-267846.htm
在各平臺(tái)上用Qt Creator創(chuàng)建、使用Qt靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法是一樣的,這里選擇Qt 5.0.1for Windows 32-bit (MinGW 4.7) 測(cè)試。
3.1、靜態(tài)庫(kù)的創(chuàng)建和使用
3.1.1、靜態(tài)庫(kù)的創(chuàng)建
(1)新建項(xiàng)目,選擇“庫(kù)”->“C++庫(kù)”
?
(2)選擇庫(kù)的類(lèi)型為“靜態(tài)鏈接庫(kù)”,命名項(xiàng)目名稱,這里命名為“staticlib”
?
(3)選擇構(gòu)建套件
?
(4)選擇模塊
?
(5)類(lèi)信息一般不用修改,直接“下一步”->“完成”
?
(6)項(xiàng)目的文件架構(gòu)如下
?
(7)添加測(cè)試代碼
1、.h頭文件添加函數(shù)聲明:voidtest();
?
2、.cpp文件添加函數(shù)體
?
3、.pro文件添加:QT+=widgets;這主要是因?yàn)镼t5用widgets組件代替了QtGui,而在創(chuàng)建庫(kù)項(xiàng)目過(guò)程中的模塊選擇時(shí)并沒(méi)有Q widgets選項(xiàng),所以要使用界面組件時(shí)只能通過(guò)勾選QtGui并在.pro文件中加上QT+=widgets來(lái)達(dá)到使用目的;Qt5.0.2已解決這個(gè)問(wèn)題,在創(chuàng)建庫(kù)時(shí)已經(jīng)有Q widgets選項(xiàng),但如果你勾選的依然是QtGui,在.pro文件中除了要加上QT+=widgets外,還要加上QT-=gui。
?
另外,在已經(jīng)構(gòu)建好(即已編譯生成Makefile)的項(xiàng)目里,手動(dòng)修改.pro文件后要點(diǎn)擊“構(gòu)建”->“執(zhí)行make”,否則,盡管是“重新構(gòu)建項(xiàng)目”,所做的修改還是不起作用的。
?
(8)編譯
?
3.1.2、靜態(tài)庫(kù)的使用
(1)新建測(cè)試工程
?
(2)命名項(xiàng)目,指定工程路徑,這里命名為“staticlibtest”
?
(3)選擇構(gòu)建套件
?
(4)選擇“基類(lèi)”,“下一步”->“完成”
?
(5)工程文件結(jié)構(gòu)
?
(6)在.pro添加靜態(tài)庫(kù)路徑,其中“INCLUDEPATH +=”用于指定頭文件路徑,“LIBS +=”用于指定庫(kù)文件路徑
?
(7)在main.cpp調(diào)用靜態(tài)庫(kù)函數(shù)
(8)編譯運(yùn)行,其中“靜態(tài)庫(kù)測(cè)試”為調(diào)用靜態(tài)庫(kù)生成的
3.2、動(dòng)態(tài)庫(kù)的創(chuàng)建和使用
3.2.1、動(dòng)態(tài)庫(kù)的創(chuàng)建
(1)動(dòng)態(tài)庫(kù)的創(chuàng)建方法與靜態(tài)庫(kù)創(chuàng)建相同,只是在第二步時(shí)選擇“庫(kù)的類(lèi)型”時(shí)選擇“共享庫(kù)”,這里命名為“l(fā)ibdll”
?
(2)頭文件結(jié)構(gòu),比靜態(tài)庫(kù)多了一個(gè)“l(fā)ibdll_global.h”頭文件
?
(3)添加測(cè)試代碼
1、.pro文件添加:QT ?+= ?widgets
?
2、libdll.h添加函數(shù)聲明:voidtest();
?
3、.cpp文件添加函數(shù)體
?
(4)編譯
3.2.2、動(dòng)態(tài)庫(kù)的使用
(1)新建測(cè)試項(xiàng)目的方法與靜態(tài)庫(kù)測(cè)試項(xiàng)目的新建一樣,這里命名為“l(fā)ibdlltest”
(2)把.dll文件拷貝到執(zhí)行文件的目錄
?
(3)在.pro文件添加路徑
?
(4)在main.cpp里調(diào)用.dll里的函數(shù)
?
(5)編譯,運(yùn)行;下面的“這是動(dòng)態(tài)庫(kù)測(cè)試”是由.dll生成的。
?
3.3、小結(jié)
在各平臺(tái)上用Qt Creator創(chuàng)建、使用Qt靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法是差不多是一樣的,只是生成的庫(kù)文件后綴不一樣而已,除了以上方法使用庫(kù)文件外,還可以通過(guò)添加“外部庫(kù)”的方法添加到目標(biāo)項(xiàng)目里使用;但是在windows下,導(dǎo)入的庫(kù)文件格式限定為(*lib),而Qt Creator-mingw生成的是.a后綴的靜態(tài)庫(kù)文件,不能以此方法,同樣也不能用此方法添加動(dòng)態(tài)庫(kù)。其實(shí)這里通過(guò)寫(xiě)代碼使用庫(kù)文件的使用方法跟MFC庫(kù)的“隱式調(diào)用”是類(lèi)似的,而上面的“添加庫(kù)”通過(guò)設(shè)置使用庫(kù)文件則可以類(lèi)比為MFC里庫(kù)的“顯式調(diào)用”。另外,創(chuàng)建和使用過(guò)程中還應(yīng)注意以下兩點(diǎn):
?
(1)在linux下編譯庫(kù)文件時(shí),系統(tǒng)時(shí)間不正確時(shí)會(huì)出現(xiàn)以下類(lèi)型的錯(cuò)誤:error: Warning: File `../LIB/LIB.pro' has modification time 4e+05 sin…,改正系統(tǒng)時(shí)間即可。
(2)使用庫(kù)時(shí)應(yīng)特別注意INCLUDEPATH +=和LIBS +=的正確寫(xiě)法,尤其是在跨平臺(tái)移植時(shí),應(yīng)注意路徑格式的轉(zhuǎn)變,很多notfound錯(cuò)誤都是由于這兩個(gè)路徑不正確引起的。
?
4、Qt程序的跨平臺(tái)移植
4.1、Qt的跨平臺(tái)
Qt的可移植性,指的是代碼不用修改,就可以在多個(gè)平臺(tái)編譯通過(guò)并運(yùn)行。針對(duì)每一種OS平臺(tái),Qt都有一套對(duì)應(yīng)的底層類(lèi)庫(kù),而接口是完全一致的。因此只要是在Qt庫(kù)上開(kāi)發(fā)的程序,放在任何一種所支持的平臺(tái)下都可以編譯運(yùn)行(前提條件是:程序中沒(méi)有使用某OS特有的機(jī)能)。也就是說(shuō)在OS和應(yīng)用層之間,增加了一個(gè)平臺(tái)層來(lái)保證可移植性。
4.2、移植方法
1、源代碼里只使用Qt庫(kù),沒(méi)有與平臺(tái)相關(guān)的代碼時(shí),一般只需在目標(biāo)平臺(tái)的Qt(版本要一樣,新版本對(duì)上一版本不完全兼容)上重新編譯即可,但要注意源碼里是否包含絕對(duì)路徑,Qt的跨平臺(tái)性是一次編寫(xiě)多次編譯,不同于java的一次編譯多次執(zhí)行。
2、如果程序中使用某些平臺(tái)相關(guān)的庫(kù)函數(shù),那么在移植時(shí)就需要針對(duì)不同平臺(tái)作一些改動(dòng)。
3、64位下開(kāi)發(fā)的QT程序, 在32位電腦上重新編譯一下就可以在32位機(jī)上運(yùn)行了, 前提是不要用到64位下才支持的函數(shù)和功能,但要注意某些數(shù)據(jù)類(lèi)型所占字節(jié)數(shù)的不同。
4.3、移植時(shí)應(yīng)注意的問(wèn)題
1、字符的編碼問(wèn)題。Windows下是ANCII編碼的,Linux下是Unicode編碼的,源程序注意轉(zhuǎn)化編碼。關(guān)于編碼的設(shè)置可參考: windows下默認(rèn)是GBK的編碼格式,如果想使用UTF8就要先修改Qt Creator的編碼格式,方法如下 Tools->Options->Environment->General->Default file encoding 修改好UTF8格式之后,再創(chuàng)建工程,就可以顯示UTF8格式的漢字了代碼如下:QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8")); qDebug()<<"不怕神一樣的對(duì)手,就怕豬一樣的隊(duì)友";或者使用這樣輸出QTextCodec* codec = QTextCodec::codecForName("UTF8") QString str = codec->toUnicode("不怕神一樣的對(duì)手,就怕豬一樣的隊(duì)友"); qDebug()<<str; 來(lái)自網(wǎng)站:http://zhidao.baidu.com/question/186780737.html 2、Linux下的文件名連后綴都是區(qū)分大小寫(xiě)的,所以一些涉及到文件讀寫(xiě)的程序,后綴名也要注意一下。另外,在包含動(dòng)態(tài)庫(kù)或靜態(tài)庫(kù)的程序在移植到另一個(gè)平臺(tái)時(shí),相應(yīng)的庫(kù)文件也要注意后綴,不同時(shí)應(yīng)當(dāng)重新編譯。
3、盡量不要在程序里寫(xiě)絕對(duì)路徑,要用相對(duì)路徑;路徑不要含中文,注意‘/’和‘\’的轉(zhuǎn)換。
?
5、版本不兼容常見(jiàn)問(wèn)題
在初學(xué)Qt,我們難免要參考網(wǎng)上例子,但網(wǎng)上的例子大多是在Qt4上開(kāi)發(fā)的,所以會(huì)出現(xiàn)一些不兼容的問(wèn)題。
(1)、QtGui模塊的問(wèn)題。用Qt5編譯Qt4的工程出現(xiàn)最多的就是下面類(lèi)型的問(wèn)題:
???錯(cuò)誤:C1083:?無(wú)法打開(kāi)包括文件:“QApplication”:?No?such?file?or?directory
???錯(cuò)誤:C1083:?無(wú)法打開(kāi)包括文件:“QMainWindow”:?No?such?file?or?directory
???出現(xiàn)原因:Qt5里不再用QtGui模塊,而是使用QtWidgets模塊。
解決方法:在.pro里加上QT?+=?widgets
(2)其他常見(jiàn)問(wèn)題集錦:
http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87
?
三、Qt界面庫(kù)基本的開(kāi)發(fā)過(guò)程,基本的控件
本部分是基于Qt5.0.1 + Qt Creator2.6.2進(jìn)行開(kāi)發(fā)的,目前還沒(méi)發(fā)現(xiàn)網(wǎng)上有Qt5的教程,鑒于與Qt4的使用大同小異,所以可以參考Qt4教程,推薦教程如下:
QtCreator教程:
《qt+creator系列教程》或《Qt_CreatoR_入門(mén)》,這兩本書(shū)內(nèi)容基本一樣:http://wenku.baidu.com/view/eac2b64133687e21af45a996.html
文檔集: http://www.open-open.com/doc/list/185
?
《C++ GUI Qt4 編程》或《精通QT4編程》,這兩本書(shū)內(nèi)容基本一樣:
http://ishare.iask.sina.com.cn/f/9045395.html
?
Qt各控件詳細(xì)說(shuō)明:
http://wenku.baidu.com/view/d64a7863af1ffc4ffe47ac7f.html
1、helloworld例子
(1)??????啟動(dòng)Qt Creator,點(diǎn)擊“Create Project”創(chuàng)建新項(xiàng)目;
?
(2)??????指定項(xiàng)目名
?
(3)??????選擇構(gòu)建套件,一般默認(rèn)即可;
?
(4)??????指定基類(lèi)
?
(5)??????直接點(diǎn)擊“完成”;
(6)??????點(diǎn)擊“mainwindow.ui”文件,進(jìn)入“設(shè)計(jì)器”;
(7)??????從控件庫(kù)拉一個(gè)靜態(tài)文本框“Label”到主界面;
(8)??????右擊控件->“改變普通文本”,寫(xiě)入“helloworld”;也可以在“屬性欄”編輯;
(9)??????保存,編譯;
(10)??運(yùn)行;
(11)??效果如下:
?
進(jìn)一步修改:(信號(hào)-槽的使用)
1往主界面添加一個(gè)按鈕“pushButton”;
2點(diǎn)擊“信號(hào)槽編輯器”->綠色“+”,新建信號(hào)-槽;(此方法適合綁定控件自帶的信號(hào)和槽)
?
3右擊“pushButton”按鈕,在彈出的菜單選擇“轉(zhuǎn)到槽”,在彈出的窗口選擇clicked信號(hào);
?
4在轉(zhuǎn)到的槽函數(shù)里編輯自定義槽函數(shù)
voidMainWindow::on_pushButton_clicked()
{
??? ui->label->setText("signal-slot!");
}
?
5保存,編輯,運(yùn)行。
點(diǎn)擊按鈕前:
點(diǎn)擊按鈕后:
?
在修改后的程序里主要演示了兩種使用信號(hào)-槽的方法,另外還可以用connect(*p, SIGNAL(f()), this, SLOT(f1()));使用信號(hào)槽,在后面會(huì)講到,此處暫不演示。
2、可視化編程介紹
Qt Gui初始界面我們可以在“設(shè)計(jì)模式”使用可視化編程來(lái)設(shè)計(jì)界面,這樣比寫(xiě)代碼更簡(jiǎn)單快捷。
(1)??????雙擊“界面文件”下的.ui文件轉(zhuǎn)到“設(shè)計(jì)模式”
?
(2)??????從控件庫(kù)往主界面拉控件構(gòu)造自己界面,選中控件可以在屬性欄編輯控件屬性;
?
?
(3)??????在行為編輯器里可以為控件添加行為和“信號(hào)-槽”
?
3、常用控件的常見(jiàn)接口
本部分只簡(jiǎn)單列舉常用的函數(shù)、信號(hào)和槽,詳細(xì)的介紹可以查看幫助文檔。
1.1、Layouts和spacers
兩者都主要是在布局中用到,通過(guò)各種嵌套可以構(gòu)造出復(fù)雜的界面布局,一般不會(huì)用到接口。
1.2、label ----靜態(tài)文本框
1、常用函數(shù)
QString???? selectedText() const??????? ???//選中的內(nèi)容
void? setSelection(int start, int length)?? //設(shè)置選中
void? setTextFormat(Qt::TextFormat)?? //設(shè)置字體格式
QString???? text() const?????????????? //獲取控件文本
2、常用信號(hào)
void??? linkActivated(constQString & link)?????? //點(diǎn)擊鏈接
void??? linkHovered(constQString & link)???? //鼠標(biāo)移到鏈接
要使label能發(fā)送這兩個(gè)信號(hào),必須先設(shè)置超鏈接,設(shè)置示例如下:
QLabel*openfilelabel=newQLabel(this);
openfilelabel->setOpenExternalLinks(true);/*這句很關(guān)鍵啊,否則就只能通過(guò)linkActivated信號(hào),連接到自定義槽函數(shù)中打開(kāi)了*/
openfilelabel->setText(tr("<ahref=\"http://www.csdn.net/\">打開(kāi)CSDN"));
openfilelabel.show();
3、常用槽
void??? clear()???????????????????????????????? //清空
void??? setPicture(const QPicture &picture)?? //顯示圖片
void??? setText(const QString &)?? ???????????//設(shè)置顯示文字
1.3、PushButton----按鈕
1、常用函數(shù)
QPushButton(QWidget* parent = 0) ?????????????????????? //構(gòu)造函數(shù)
QPushButton(constQString & text, QWidget * parent = 0)?? ??
QPushButton(constQIcon & icon, const QString & text, QWidget * parent = 0)?? ?
void?QButton::setText ( const?QString?&)?? ??// 設(shè)置這個(gè)按鈕上顯示的文本
QString? text() const //返回這個(gè)按鈕上顯示的文本
2、常用信號(hào)
Clicked()? //被點(diǎn)擊
3、常用槽
setEnabled(bool)?? //設(shè)置按鈕有效
setDisabled(bool) //設(shè)置按鈕失效
?
1.4、CheckBox----復(fù)選框
1、常用函數(shù)
Bool isChecked() const??? ??????????????????? //檢查是否被勾選
2、常用信號(hào)
stateChanged(int)? //狀態(tài)改變
3、常用槽
setChecked(bool)???????????? //設(shè)置選中狀態(tài)
setEnabled(bool)?? //設(shè)置按鈕有效
setDisabled(bool) //設(shè)置按鈕失效
1.5、listWidget----列表
1、常用函數(shù)
void addItem(constQString & label)?????? ? ?????????????????????? //加入項(xiàng)(參數(shù)為字符串)
void addItem(QListWidgetItem* item) ??????????????????????? //加入項(xiàng)(參數(shù)為字符串)
void addItems(constQStringList & labels) ????????????????????? //加入多項(xiàng)(參數(shù)為列表)
void? insertItem(int row, QListWidgetItem *item)??? //插入項(xiàng)
void? insertItem(int row, const QString &label)
void? insertItems(int row, const QStringList& labels)
QListWidgetItem *? currentItem() const???????????????????????????????????? //獲取當(dāng)前項(xiàng)
void? removeItemWidget(QListWidgetItem *item)?????? //刪除項(xiàng),但在實(shí)際應(yīng)用中調(diào)用該函數(shù)后,并沒(méi)有刪除項(xiàng),需要再調(diào)用delete才能刪除,其實(shí)直接調(diào)用delete也可以刪除,但不知道會(huì)不會(huì)有什么不良后果。使用舉例如下:
listWidget->removeItemWidget(listWidget->currentItem());
delete listWidget->currentItem();
參考網(wǎng)址:http://sweetdum.com/wordpress/?p=290
2、常用信號(hào)
void? currentItemChanged(QListWidgetItem *current, QListWidgetItem * previous)
void? currentRowChanged(int currentRow)
void? currentTextChanged(const QString ¤tText)
void? itemChanged(QListWidgetItem * item)
void? itemClicked(QListWidgetItem * item)
void? itemDoubleClicked(QListWidgetItem *item)
void? itemSelectionChanged()
3、常用槽
Clear()???????? ????????????????????????//清空
ScrollToItem(QListWidgetItem * item)??????????? //轉(zhuǎn)到項(xiàng),可用于查找
?
1.6、tableWidget----表格
推薦網(wǎng)址:http://music.573114.com/Blog/Html/6016/203347.html
1、常用函數(shù)
QTableWidget(int rows, int columns, QWidget * parent = 0)????????????????? //構(gòu)造表格
void? setColumnCount(int columns)?????????????????????????????????????????????????????? ??? //設(shè)置表格列數(shù)
void? setRowCount(int rows)???????????????????????????????????????????????????????????????????????????? //設(shè)置表格行數(shù)
void? setHorizontalHeaderItem(int column,QTableWidgetItem * item)?????? //設(shè)置列名
void? setHorizontalHeaderLabels(constQStringList & labels)????????????????????????? //設(shè)置表頭
void? setItem(int row, int column,QTableWidgetItem * item)?????????????????????????? //設(shè)置單元表格內(nèi)容
2、常用信號(hào)
//此處cell和item是差不多的,只是cell用行和列定位,item用指針定位。
void? cellChanged(int row, int column)
void? cellClicked(int row, int column)
void? cellDoubleClicked(int row, int column)???????????
void? currentCellChanged(int currentRow, intcurrentColumn, int previousRow, int previousColumn)
void? currentItemChanged(QTableWidgetItem *current, QTableWidgetItem * previous)
void? itemChanged(QTableWidgetItem * item)
void? itemClicked(QTableWidgetItem * item)
void? itemDoubleClicked(QTableWidgetItem *item)
void? itemSelectionChanged()
3、常用槽
void? clear()??????????????????????????????????????????? //清空表格
void? clearContents()????????????????????????? //清空表格內(nèi)容
void? insertColumn(int column)?????? //插入列
void? insertRow(int row)??????????????????? //插入行
void? removeColumn(int column)??? //刪除列
void? removeRow(int row)??????????????? //刪除行
void? scrollToItem( const QTableWidgetItem * item, QAbstractItemView::ScrollHint hint =EnsureVisible )????????????????? //滾動(dòng)到項(xiàng),常用于查找
setSortingEnabled(true);??????????????????????????????? // 設(shè)置點(diǎn)擊表頭自動(dòng)排序
setSelectionBehavior(QAbstractItemView::SelectRows);??? ????? //整行選中的方式
setEditTriggers(QAbstractItemView::NoEditTriggers);??????????????????? //設(shè)置單元表格不可編輯
1.7、treeWidget----樹(shù)
1、常用函數(shù)
void? addTopLevelItem(QTreeWidgetItem * item)?????????????????? ??????????????????????????? //插入一個(gè)頂級(jí)項(xiàng)
void? addTopLevelItems(constQList<QTreeWidgetItem *> & items)??? //插入多個(gè)頂級(jí)項(xiàng)
QTreeWidgetItem *???????? currentItem() const???????????????????????????????????? ??????????????????????????? //獲取當(dāng)項(xiàng)
void? setHeaderLabel(const QString &label)??????????????????? ??????????????????????????? //加入樹(shù)的屬性列名
void? setHeaderLabels(const QStringList &labels)?????????????????? ??????????????????????????? //加入樹(shù)的多個(gè)屬性列名
2、常用信號(hào)
void? currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem * previous)
void? itemChanged(QTreeWidgetItem * item, intcolumn)
void? itemClicked(QTreeWidgetItem * item, intcolumn)
void? itemDoubleClicked(QTreeWidgetItem *item, int column)
void? itemSelectionChanged()
3、常用槽
void? clear()???????????????????????????????????????????????????????????????????????????????? //清空
void? collapseItem(const QTreeWidgetItem *item)?????? //收起
void? expandItem(const QTreeWidgetItem *item)????????????????? //展開(kāi)
void? scrollToItem(const QTreeWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)??????????? //滾動(dòng)到項(xiàng),常用于查找
?
1.8、progressBar----進(jìn)度條
1、常用函數(shù)
QProgressDialog( const QString & labelText, const QString& cancelButtonText, int minimum, int maximum, QWidget * parent = 0,Qt::WindowFlags f = 0 )??????????? //構(gòu)造函數(shù)
int??? maximum() const??? //獲取最大值
int??? minimum() const???? //獲取最小值
int??? value() const?? ???????? //獲取當(dāng)前值
2、常用信號(hào)
void? valueChanged(int value)
3、常用槽
void? reset()
void? setMaximum(int maximum)?? ??????????????????????????? //設(shè)置最大值
void? setMinimum(int minimum)???? ??????????????????????????? //設(shè)置最小值
void? setRange(int minimum, int maximum)??????????? //設(shè)置值范圍
void? setValue(int value)? ?????????????????????????????????????????????? //設(shè)置當(dāng)前值
?
1.9、comboBox----組合下拉框
1、常用函數(shù)
void? addItem(const QString & text, constQVariant & userData = QVariant())? //加入純文本
void? addItem(const QIcon & icon, constQString & text, const QVariant & userData = QVariant())???? //加入圖標(biāo)和文字
void? addItems(const QStringList & texts)????? //批量加入
QString???? currentText() const???????????????????????????? //當(dāng)前內(nèi)容
void? insertItem(int index, const QString& text, const QVariant & userData = QVariant())
void? insertItem(int index, const QIcon &icon, const QString & text, const QVariant & userData = QVariant())
void? insertItems(int index, constQStringList & list)
void? removeItem(int index)
2、常用信號(hào)
void? currentIndexChanged(int index)
void? currentIndexChanged(const QString &text)
void? currentTextChanged(const QString &text)
void? editTextChanged(const QString &text)
void? highlighted(int index)
void? highlighted(const QString & text)
3、常用槽
void? clear()
void? clearEditText()
void? setCurrentIndex(int index)
void? setCurrentText(const QString &text)
void? setEditText(const QString & text)
?
1.10 QmessageBox----消息提示盒
(1)常用函數(shù)
QPushButton *???????? addButton(constQString & text, ButtonRole role)??????? //加按鈕
QPushButton *???????? addButton(StandardButtonbutton)
void? removeButton(QAbstractButton * button)
void? setDefaultButton(QPushButton * button)???? //設(shè)置默認(rèn)按鈕
void? setInformativeText(const QString &text)
void? setStandardButtons(StandardButtonsbuttons)?? //設(shè)置標(biāo)準(zhǔn)按鈕
void? setText(const QString & text)
void? setWindowTitle(const QString &title)
?
靜態(tài)函數(shù):
void? about(QWidget * parent, const QString& title, const QString & text)
void? aboutQt(QWidget * parent, const QString& title = QString())
StandardButton?????? critical(QWidget *parent, const QString & title, const QString & text, StandardButtonsbuttons = Ok, StandardButton defaultButton = NoButton)
StandardButton?????? information(QWidget* parent, const QString & title, const QString & text, StandardButtonsbuttons = Ok, StandardButton defaultButton = NoButton)
StandardButton?????? question(QWidget *parent, const QString & title, const QString & text, StandardButtonsbuttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
StandardButton?????? warning(QWidget *parent, const QString & title, const QString & text, StandardButtonsbuttons = Ok, StandardButton defaultButton = NoButton)
?
(2)常見(jiàn)用法舉例:
例1:
QMessageBox msgBox;
msgBox.setText("The document has beenmodified.");
msgBox.setInformativeText("Do you wantto save your changes?");
msgBox.setStandardButtons(QMessageBox::Save| QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
?
switch (ret) {
?case QMessageBox::Save:
?????// Save was clicked
?????break;
?case QMessageBox::Discard:
?????// Don't Save was clicked
?????break;
?case QMessageBox::Cancel:
?????// Cancel was clicked
?????break;
?default:
?????// should never be reached
?????break;
}
效果圖:
?
例2:
int ret = QMessageBox::warning(this,tr("My Application"),
?????????????????????????????? tr("Thedocument has been modified.\n"
????????????????????????????????? "Do youwant to save your changes?"),
??????????????????????????????QMessageBox::Save | QMessageBox::Discard
?????????????????????????????? |QMessageBox::Cancel,
??????????????????????????????QMessageBox::Save);
效果圖:
?
1.11 QFileDialog----文件選擇框
(1) 常見(jiàn)函數(shù)
最常用的靜態(tài)成員函數(shù):
1QString????? getExistingDirectory( QWidget * parent = 0, const QString & caption= QString(), const QString & dir = QString(), Options options =ShowDirsOnly )
2QString????? getOpenFileName ( QWidget * parent = 0,const QString & caption = QString(), const QString & dir = QString(),const QString & filter = QString(), QString * selectedFilter = 0, Optionsoptions = 0 )
3QStringList??????? getOpenFileNames ( QWidget * parent = 0,const QString & caption = QString(), const QString & dir = QString(),const QString & filter = QString(), QString * selectedFilter = 0, Optionsoptions = 0 )
4QString????? getSaveFileName ( QWidget * parent = 0, const QString & caption = QString(),const QString & dir = QString(), const QString & filter = QString(),QString * selectedFilter = 0, Options options = 0 )
?
void? selectFile(const QString &filename)
void? selectNameFilter(const QString &filter)
QStringList?????? selectedFiles() const
QString???? selectedNameFilter() const
void? setAcceptMode(AcceptMode mode)
void? setDefaultSuffix(const QString &suffix)
void? setDirectory(const QString &directory)
void? setDirectory(const QDir &directory)
?
?(2)常見(jiàn)用法舉例:
例1:
QFileDialog fildlg;
???fildlg.setAcceptMode(QFileDialog::AcceptOpen);
???if(fildlg.exec()==QFileDialog::Accepted) // ok
??????? {
??????? int ret =QMessageBox::information(this, "Title", "打開(kāi)成功",
??????????????????????????????????QMessageBox::Ok, QMessageBox::Ok);
?
?????? ?}
效果圖:
?
例2:
QStringfileName=QFileDialog::getOpenFileName(this,
tr("OpenImage"),"/home/jana",tr("Image Files(*.png *.jpg *.bmp)"));
效果圖:
1.12 QSystemTrayIcon----托盤(pán)類(lèi)
(1)常用函數(shù)
void? setContextMenu( QMenu * menu )?????? //設(shè)置托盤(pán)右鍵菜單
void? setIcon( const QIcon & icon )??????????????????????????? //設(shè)置圖標(biāo)
void? setToolTip( const QString & tip )???????????? //設(shè)置托盤(pán)名稱
void? showMessage( const QString & title, const QString & message, MessageIcon icon =Information, int millisecondsTimeoutHint = 10000 )????????? //設(shè)置氣泡顯示信息
?
常用信號(hào)
void? activated( QSystemTrayIcon::ActivationReason reason )????? /*激活理由(單擊,雙擊等),通常用
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));綁定。*/
void? messageClicked()
1.13 QThread----線程類(lèi)
(1)常用函數(shù)
void? exit( int returnCode = 0 )???????? //退出,返回一個(gè)代碼
bool isFinished() const????????????????????? //檢查線程是否結(jié)束
bool isRunning() const???????????????????? //檢查線程是否在運(yùn)行
?
常用信號(hào)
void? finished()???????????????????????????????????? //結(jié)束
void? started()????????????????????????????????????? //開(kāi)始
void? terminated()????????????????????????????? //終止
?
???????? 常用槽:
???????? void? quit()?????????????????????????????????? ???????? //退出,返回0,相當(dāng)于QThread::exit(0)
void? start (Priority priority = InheritPriority ) //開(kāi)始
void? terminate()???????????????????????????????? //終止
?
1.14 線程和信號(hào)-槽用法舉例
使用舉例:
//MyThread.h
class MyThread :public QThread
{
??? Q_OBJECT?????????????????????????? //要使用“信號(hào)-槽”機(jī)制就要加入這句
signals:
??? void ShowWin(int i);
protected:
??? void run();
};
?
//MyThread.cpp
voidMyThread::run()??????????????? //run是線程的核心函數(shù),自定義操作都在這里進(jìn)行
{
??? while(1)
??? {
??????? emit ShowWin(10);
??? }
}
?
//mainwindow.h
class MainWindow: public QMainWindow
{
??? Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private slots:
??? void SetShow(int i);
}
?
//mainwindow.cpp
MainWindow::MainWindow(QWidget*parent) :
??? QMainWindow(parent),
??? ui(new Ui::MainWindow)
{
??? ui->setupUi(this);
?
???????? MyThread ?*thread = new MyThread(parent);
??? connect(thread, SIGNAL(ShowWin(int)), this, SLOT(SetShow(int)));??????? //在綁定信號(hào)槽時(shí),信號(hào)函數(shù)和槽函數(shù)的參數(shù)均只有數(shù)據(jù)類(lèi)型,沒(méi)有變量名
??? thread->start();
}
?
voidMainWindow:: SetShow(int i)
{
??? Std::cout<<i<<std::endl;
??? show();
}
?
若要在自定義線程里編輯界面,不可以直接通過(guò)窗口指針來(lái)操作界面,直接操作界面會(huì)莫名其妙地崩潰,應(yīng)當(dāng)通過(guò)信號(hào)槽機(jī)制來(lái)編輯界面。
四、QtWebkit的使用
1、QtWebkit從Qt4.4版本開(kāi)始引入,若Qt4.4以上沒(méi)發(fā)現(xiàn)QtWebkit組件極有可能是安裝不完全所致。
2、使用webkit時(shí)注意要在.pro文件添加相應(yīng)選項(xiàng):QT+= webkitwidgets(Qt5版本),QT += webkit(Qt4版本)
3、簡(jiǎn)單Demo存放在:\\192.168.1.1\temp\kongfy\webkit_Demo
參考網(wǎng)址:http://blog.csdn.net/liuhongwei123888/article/details/6111434
http://www.tuicool.com/articles/iayIj2
?
總結(jié)
- 上一篇: 四旋翼无人机硬件基础
- 下一篇: jsDelivr的CDN加速被污染