




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Qt圖形用戶界面編程技術(shù)入門 2008-06-13 15:33:39來源:天極網(wǎng)作者:YESKY 點擊: 7125 本文向讀者介紹利用Qt開發(fā)圖形用戶界面的應(yīng)用程序的入門知識。這里,我們首先介紹了如何搭建Qt的開發(fā)環(huán)境,之后通過一些簡單的示例程序來循序漸進地介紹Qt的“信號和槽”以及布局等基本概念。本文向讀者介紹利用Qt開發(fā)圖形用戶界面的應(yīng)用程序的入門知識。這里,我們首先介紹了如何搭建Qt的開發(fā)環(huán)境,之后通過一些簡單的示例程序來循序漸進地介紹Qt的“信號和槽”以及布局等基本概念。我們希望以此來幫助讀者盡快地對Qt圖形用戶界面應(yīng)用程序開發(fā)有一個初步的認識,并為進一步學(xué)習(xí)打下一個良好的基礎(chǔ)。 一、
2、什么是QtQt 是一個用于桌面系統(tǒng)和嵌入式開發(fā)的跨平臺應(yīng)用程序框架。它包括一個直觀的API和一個豐富的類庫,以及用于GUI開發(fā)和國際化的集成工具,另外它支持Java和C+開發(fā)。利用它,我們無須重新編寫源代碼,便可以構(gòu)建運行在不同桌面操作系統(tǒng)和嵌入式設(shè)備上的軟件應(yīng)用程序。借助Qt,我們可以更快速地構(gòu)建先進的用戶界面:它不僅提供了豐富的標(biāo)準(zhǔn)widgets庫,動態(tài)布局引擎等GUI功能,還通過集成OpenGL® 與OpenGL ES提供了先進的3D可視化支持,此外,它還具有強大的圖形畫布和Widgets樣式表,使我們得以使用變焦、旋轉(zhuǎn)和人機互動功能構(gòu)建先進的用戶界面,并且能用寥寥幾行代碼便可
3、快速定制自己的用戶界面。雖然Qt提供了許多高級功能,但千里之行,始于足下,還是讓我們先從最基本的知識開始入手吧。下面介紹如何搭建Qt開發(fā)環(huán)境。二、搭建Qt開發(fā)環(huán)境雖然Qt自身帶有構(gòu)建工具,但它是在命令行下使用的,多少有些不便。所以,我們在此自己動手建設(shè)自己的Qt集成開發(fā)環(huán)境。下面介紹Qt開發(fā)環(huán)境的具體搭建過程。最后,把Qt安裝目錄中的bin目錄中的動態(tài)鏈接庫拷貝到windows目錄下,這樣當(dāng)運行編譯好的Qt程序時,就再也不會碰到無法找到Qt的DLL 的問題了。三、我們的第一個Qt程序迄今為止,我們已經(jīng)搭建好了Qt的開發(fā)環(huán)境,接下來就可以編寫我們的第一個Qt程序。按照學(xué)習(xí)編程的老傳統(tǒng),一般編寫的
4、第一個程序都是一個Hello程序,我們也不例外。運行Dev-C+,在其“文件”菜單中選擇“新建”菜單項,然后單擊“工程”命令,出現(xiàn)如下圖所示的對話框:圖1 新建Qt工程選擇其中的“Empty Project”,以便建立一個空項目,將項目名稱定為“hello”,其他選擇默認,如圖1所思,然后單擊“確定”按鈕。在彈出的“Create new project”對話框中選擇工程文件名稱和保存路徑,如圖2所示。圖2 保存項目文件上面已經(jīng)新建了一個空的Qt項目,現(xiàn)在為它添加一個源代碼文件。在Dev-C+的“文件”菜單中選擇“新建”菜單項,然后單擊“源代碼”命令,在彈出的確認對話框中單擊“Yes”按鈕。在編
5、輯區(qū)中錄入如下代碼,保存源代碼文件時將其命名為hello.cpp。 #include #include int main(int argc, char *argv QApplication app(argc, argv; QLabel *label = new QLabel("Hello
6、;World!" label->show(; return app.exec(; 現(xiàn)在,讓我們來編譯該程序。單擊“運行”菜單中的“編譯”菜單項,出現(xiàn)如下圖所示對話框時,說明沒有出現(xiàn)錯誤,編譯成功。圖3 編譯成功單擊“關(guān)閉”按鈕。很好,現(xiàn)在運行我們第一個Qt應(yīng)用程序的時候到了,單擊“運行”菜單中的“運行”菜單項。來,看看我們的“大作”吧!圖4 我們的hello程序上面演示了在集成開發(fā)環(huán)境中開發(fā)Qt應(yīng)用程序的整個過程,下面開始介紹我們的源代碼
7、。俗話說,萬事開頭難,所以我們在這里會盡可能細致地為讀者講解這些代碼。#include #include 在這個程序中,我們總共用到了兩個類QApplication和Qlabel,根據(jù)先聲明后使用的原則,我們在上面兩行將這兩個類的定義包含到我們的代碼中。對Qt來說,它的每一個類都有一個同名的頭文件與之對應(yīng),這個類的定義就在這個頭文件中。我們注意到,這兩個頭文件都是以大寫字母開頭的,實際上類對應(yīng)的頭文件都是這樣。int main(int argc, char *argv在這里,main(函數(shù)是程序的入口。在使用Qt的時候,main(
8、一般只是執(zhí)行一些初始化工作,接著就把控制轉(zhuǎn)交給Qt庫,然后Qt庫通過事件來向程序報告用戶的行為。QApplication app(argc, argv;上面這行代碼為QApplication創(chuàng)建了一個對象,實際上,在每一個使用Qt的應(yīng)用程序中都必須有一個QApplication對象,該對象用來管理應(yīng)用程序的各種資源。一般說來,在使用Qt的窗口部件被之前,要首先創(chuàng)建QApplication對象。因為Qt支持命令行參數(shù),所以這里的QApplication帶有argc和argv,用來接收入口函數(shù)從系統(tǒng)那里接收到的命令行變量,以便進一步處理。QLabel *label
9、160;= new QLabel("Hello World!"這一行創(chuàng)建了一個窗口部件QLabel,我們用它來顯示一則消息“Hello World!”。按照Qt的術(shù)語,一個窗口部件就是用戶界面中的一個可見的用戶界面對象,它能夠處理用戶輸入和繪制圖形,它相當(dāng)于Windows的術(shù)語中的一個控件或容器。我們可以改變窗口部件的全部觀感、主要屬性(比如顏色等以及窗口部件的內(nèi)容等。我們常見的按鈕、菜單、滾動條和框架等都屬于窗口部件。窗口部件可以包含其它的窗口部件,比如應(yīng)用程序窗口通常就是一個窗口部件,而其中又包含了QMenuBar、QToolBars、Qs
10、tatusBar以及其它的窗口部件。大多數(shù)應(yīng)用程序使用一個QMainWindow或者QDialog作為自己的主窗口,但是這不是必須的的,實際上任何窗口部件都能當(dāng)作程序的主窗口。就本例而言,窗口部件QLabel就是應(yīng)用程序的主窗口或者說是主窗口部件。如果用戶關(guān)閉了主窗口部件,應(yīng)用程序就會退出。label->show(;默認時,窗口部件是不可見的,之所以這樣,是為了讓我們可以在顯示之前對窗口部件進行必要的設(shè)定,以防止閃爍現(xiàn)象的發(fā)生。上面這一行代碼的作用是使標(biāo)簽變?yōu)榭梢姷摹eturn app.exec(;上面這一行代碼將應(yīng)用程序的控制權(quán)交給Qt,交權(quán)后,應(yīng)用程序便進入事件循環(huán)狀態(tài)。
11、這時的程序只是靜靜地等待用戶的鼠標(biāo)或鍵盤之類的動作。當(dāng)用戶發(fā)出動作時,就會生成相應(yīng)的事件,如果這些事件正是該程序需要響應(yīng)的那些事件,它便會執(zhí)行一些函數(shù)來響應(yīng)用戶的動作。迄今為止,我們已經(jīng)編譯運行了第一個Qt應(yīng)用程序,并且對該程序的源代碼有了初步的了解,但是我們的這個程序非常簡單,簡單到顯示一條消息后就只能通過標(biāo)題欄上的“關(guān)閉”按鈕來關(guān)閉。接下來我們將進一步學(xué)習(xí)如何通過窗口部件來跟用戶互動。四、跟用戶互動在第二個實例中,我們將為大家介紹如何響應(yīng)用戶的動作。該程序也很簡單,它僅由一個按鈕組成,當(dāng)用戶單擊該按鈕時,程序就會退出。這個應(yīng)用程序運行畫面如下所示:圖5 利用按鈕跟用戶進行交互下面是該程序的
12、源代碼:#include #include int main(int argc, char *argv QApplication app(argc, argv; QPushButton *button = new QPushButton("Quit" QObject:connect(button, SIGNAL(clicked(, &app, SLOT(quit(; button->show(; return
13、;app.exec(; 我們看到,這里的源代碼跟上面的非常相似,只有兩處不一樣,一是主窗口部件是QPushButton,而非Qlabel;二是將用戶操作(如這里的單擊按鈕跟一段代碼聯(lián)系在一起。當(dāng)用戶執(zhí)行某些操作,或狀態(tài)發(fā)生變化時,Qt的窗口部件就會發(fā)出一些信號來指示這些事件的發(fā)生。舉例來說,當(dāng)用戶單擊按鈕時,QPushButton就會發(fā)出一個clicked(信號。這時,跟這個事件相聯(lián)系的代碼就會就會自動執(zhí)行。在QT中,對這樣的代碼有一個專門的稱謂,叫做槽。對這里的例子來說,我們將按鈕的clicked(信號連到QApplication的槽quit(上。所以,單擊Quit按鈕,或按下空格鍵時,該程
14、序就會終止。這里涉及到Qt的一個基本思想,那就是“信號和槽”。這一思想需要專門一篇文章來進行解釋,我們這里只要知道,每個Qt對象,無論是直接還是間接繼承QObject對象的對象,都能用信號發(fā)出信息,也能用槽來接收信息并作出反應(yīng)。這里要注意的是,所有窗口部件都是Qt對象,因為它們繼承自QWidget,而Qwidget又繼承自QObject。這里的connect(是QObject中的一個靜態(tài)函數(shù),它的作用是將信號和槽連接在一起。比如本例中,它把按鈕的clicked(信號和QApplication的槽quit(連接起來了,所以當(dāng)這個按鈕被按下的時候,這個程序就退出了。五、窗口部件的布局讀者可能已經(jīng)發(fā)
15、現(xiàn),我們上面的兩個例子中,都只是用了一個窗口部件,但是現(xiàn)實情況卻是一個程序界面中有多個窗口部件,并且一些窗口部件通常還位于其他窗口部件之內(nèi)。這時問題就來了:如何將一些窗口部件放進另一個窗口部件中?放進去以后又如何對它們進行布置呢?別急,這些事情Qt的設(shè)計者早就替我們考慮到了,下面就介紹Qt的自動布局支持。除了解釋如何使用布局來管理窗口部件在窗口中的幾何形狀之外,本示例程序還將為讀者介紹如何使用信號和槽來實現(xiàn)兩個窗口部件的同步。如下圖所示:圖6 窗口部件布局與同步示例我們可以在這個界面中輸入一個1到100之間的數(shù)字。當(dāng)然,我們可以用兩種方法輸入數(shù)字,既可以拖動滑塊,也可以使用Spinbox按鈕。
16、但是,無論使用哪一種方式,只要一邊表示的數(shù)字發(fā)生了變化,另一邊也會隨之改變,所以它們總能保持一致。該示例程序的源代碼如下所示: #include #include #include #include int main(int argc, char *argv QApplication app(argc, argv; QWidget *window = new QWidget; window->setWindowTitle("E
17、nter Your Number" QSpinBox *spinBox = new QSpinBox; QSlider *slider = new QSlider(Qt:Horizontal; spinBox->setRange(0, 100; slider->setRange(0, 100; QObject:connect(spinBox, SIGNAL(valueChanged(int, slider, SLOT(setValue
18、(int; QObject:connect(slider, SIGNAL(valueChanged(int, spinBox, SLOT(setValue(int; spinBox->setValue(60; QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(spinBox; layout->addWidget(slider; window->setLayout(layout; window->show(; return app.e
19、xec(; 該應(yīng)用程序的界面由三個窗口部件組成,分別是QSpinBox、QSlider和QWidget,其中QWidget是本程序的主窗口,然后在QWidget內(nèi)再引用QSpinBox和QSlider,所以后兩者是前者的子部件,或者說前者是后兩者的父部件。QWidget本身沒有父部件,因為它是一個頂級窗口。QWidget及其子類的構(gòu)造函數(shù)使用參數(shù)QWidget *來規(guī)定其父部件。下面我們對源代碼進行解釋:QWidget *window = new QWidget; window->setWindowTitle("Enter Yo
20、ur Number"上面兩行將QWidget設(shè)置為該程序的主窗口,其中setWindowTitle(用于規(guī)定顯示在這個窗口標(biāo)題欄中的文本內(nèi)容。QSpinBox *spinBox = new QSpinBox; QSlider *slider = new QSlider(Qt:Horizontal;上面兩行創(chuàng)建了一個QSpinBox和一個QSlider,然后,spinBox->setRange(0, 100; slider->setRange(0, 100;這兩行設(shè)
21、置了其有效范圍,我們這里選擇0至100之間的數(shù)字。QObject:connect(spinBox, SIGNAL(valueChanged(int, slider, SLOT(setValue(int; QObject:connect(slider, SIGNAL(valueChanged(int, spinBox, SLOT(setValue(int;在上面的兩個語句中,我們調(diào)用了QObject:connect(兩次,實現(xiàn)了Spinbox按鈕和滑塊之間的同步,從而使得顯示的結(jié)果將保持一致。當(dāng)一個窗口部件中的值發(fā)生變化時,它就會發(fā)出valueChange
22、d(int信號,并用這個新值來調(diào)用另一個窗口部件的槽setValue(int,這樣它們就能保持一致。 spinBox->setValue(60;上面這一行代碼將Spinbox按鈕的值設(shè)為60。這時,QSpinBox會發(fā)出valueChanged(int信號,其中參數(shù)int為60,這個參數(shù)傳遞給QSlider的槽setValue(int,這個槽繼而將滑塊值設(shè)為60。 因為滑塊自己的值變了,所以它會發(fā)出信號valueChanged(int來觸發(fā)Spinbox按鈕的槽setValue(int。不過由于Spinbox按鈕的值早已是60,兩者是一致的,所以它就不會繼續(xù)發(fā)信號了,同步過程至此結(jié)束。QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(spinBox; layout->addWidget(slider;通過上面三行代碼,我們新建了一個一個布局管理器,然后將Spinbox按鈕和滑塊這兩個窗口部件交給這個布局管理器,讓它來對這兩個部件的大小和位置等作出安排。一個布局管理器是一個對象,用于設(shè)置窗口部件的位置和尺寸。Qt的布局管理器分為三大類:· QHBoxL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具拆卸搬運合同范本
- 點火系統(tǒng):點火開關(guān)競爭策略分析報告
- 中醫(yī)護理質(zhì)量自查報告
- 個人股份協(xié)議書
- 個人租房合同簡易版
- 廈門運輸合同范例
- 賣煤提成合同范例
- 丑小鴨閱讀心得體會
- 廠房裝修材料合同范本
- 廚房櫥柜合同范本
- 家具廠安全生產(chǎn)操作規(guī)程大全
- 神經(jīng)病學(xué)-緒論課件
- 危險化學(xué)品全表
- 胸膜疾病課件
- 公路施工技術(shù)全套課件
- 胸痹心痛中醫(yī)診療方案及臨床路徑
- 泛讀2unit2-music
- 中學(xué)生防溺水安全教育課件(PPT 44頁)
- 2019版外研社高中英語選擇性必修二Unit 1 Growing up 單詞表
- 有機金屬化學(xué)1
- JIT標(biāo)準(zhǔn)作業(yè)作業(yè)指導(dǎo)書
評論
0/150
提交評論