嵌入式系統(tǒng)實(shí)驗(yàn)——實(shí)驗(yàn)五_第1頁
嵌入式系統(tǒng)實(shí)驗(yàn)——實(shí)驗(yàn)五_第2頁
嵌入式系統(tǒng)實(shí)驗(yàn)——實(shí)驗(yàn)五_第3頁
嵌入式系統(tǒng)實(shí)驗(yàn)——實(shí)驗(yàn)五_第4頁
嵌入式系統(tǒng)實(shí)驗(yàn)——實(shí)驗(yàn)五_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、嵌入式系統(tǒng)實(shí)驗(yàn)實(shí)驗(yàn)五實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)內(nèi)容Qt介紹Qt編程特點(diǎn)實(shí)驗(yàn)步驟實(shí)驗(yàn)?zāi)康牧私庠贚inux下安裝Qt以及Qt/Embedded的根本步驟學(xué)會(huì)在Qt/E平臺(tái)下使用Virtual framebuffer顯示程序結(jié)果實(shí)驗(yàn)內(nèi)容在Linux系統(tǒng)的宿主PC下,編譯和使用Qt/E平臺(tái)在Qt/E平臺(tái)下編譯和運(yùn)行一個(gè)程序使用Virtual framebuffer顯示運(yùn)行結(jié)果Qt 簡介Qt是Trolltech公司的標(biāo)志性產(chǎn)品,是一個(gè)跨平臺(tái)的C+圖形用戶界面GUI工具包Qt應(yīng)用程序接口與工具兼容于所有支持平臺(tái),讓開發(fā)員們掌握一個(gè)應(yīng)用程序接口,便可執(zhí)行與平臺(tái)非相關(guān)的應(yīng)用開發(fā)與配置Qt/Windows (Windows

2、XP, 2000, NT 4, Me/98)Qt/Mac (Mac OS X)Qt/X11 (Linux, Solaris, HP-UX, IRIX, AIX等)Qt對不同平臺(tái)的專門API進(jìn)行了專門的封 裝文件處理,網(wǎng)絡(luò)等Qt 特征1面向?qū)ο驫t具有模塊設(shè)計(jì)和注重軟件構(gòu)件或元素的可重用行的特點(diǎn)構(gòu)件支持Qt提供信號(hào)signal和插槽slot概念,這是一種類型平安的方法,它允許回調(diào),并支持對象之間在彼此不知道對方信息的情況下進(jìn)行合作,這使得Qt非常適合于真正的構(gòu)件編程友好的聯(lián)機(jī)幫助Qt提供了大量的聯(lián)機(jī)參考文檔,有超文本HTML方式,也有Unix幫助頁man手冊頁和補(bǔ)充說明。并且對于初學(xué)者,其中的指

3、南將一步步介紹如何進(jìn)行Qt編程Qt 特征2便利性由于Qt是一種跨平臺(tái)的GUI工具包,它對編程者隱藏了在處理不同窗口系統(tǒng)時(shí)潛在的問題,Qt定義了一些類來隱藏在不同操作系統(tǒng)上不同處理方式下的細(xì)節(jié)問題用戶自定義使用其他的一些工具包經(jīng)常會(huì)遇到這樣一種情況,沒有真正適合需求的組件,聲稱自定義的組件對用戶來說就像一個(gè)黑匣子。而在Qt中生成用戶自定義的組件非常簡單,而且易于修改組件的行為國際化Qt為本地化應(yīng)用提供了完全的支持,所有用戶界面文本都可以基于消息翻譯表被翻譯成各國語言,Qt還支持雙字節(jié)16bit國際字符標(biāo)準(zhǔn)Qt 特征3豐富的API函數(shù)Qt為專業(yè)應(yīng)用提供了大量的函數(shù),在Qt的API中含有大約250個(gè)

4、C+類,大多數(shù)的類都是GUI專有的可用戶化外觀Qt支持主題,基于Qt的應(yīng)用程序能夠在Windows外觀、Motif外觀,以及其它一些用戶化外觀主題之間切換完整的一套組件工具Qt編程的根本模塊稱之為組件,組件是用戶界面的組成局部,Qt含有用來創(chuàng)立專業(yè)外觀的用戶界面所需要的所有組件Qt 編程特點(diǎn)1. 初始化在Qt應(yīng)用程序中,首先要?jiǎng)?chuàng)立一個(gè)QApplication對象,QApplication類負(fù)責(zé)圖形用戶界面應(yīng)用程序的控制流和主設(shè)置,在main.cpp中定義如下:int main(int argc, char *argv) QApplication a(argc, argv);1. 初始化QApp

5、lication包含在main()函數(shù)的事件循環(huán)體中,對所有來自Window系統(tǒng)和其它源文件的事件進(jìn)行處理和調(diào)度,還包括處理應(yīng)用程序的初始化和結(jié)束,并且提供會(huì)話管理。在Qt應(yīng)用程序中,不管有多少個(gè)窗口,QApplication對象只能有一個(gè),而且必須在其他對象之前創(chuàng)立。QApplication類中封裝了很多函數(shù),其中包括:系統(tǒng)設(shè)置:setFont() 用來設(shè)置字體事件處理:sendEvent() 用來發(fā)送事件GUI風(fēng)格:setStyles() 設(shè)置圖形用戶界面的風(fēng)格顏色使用:colorSpec() 用來返回顏色文件文本處理:translate() 用來處理文本信息創(chuàng)立組件:setmainWid

6、get() 用來設(shè)置窗口的主組件2. 窗口的創(chuàng)立在Qt程序中,創(chuàng)立窗口比較簡單,只要在main.cpp文件中為ApplicationWindow建立一個(gè)指針:ApplicationWindow *mw = new ApplicatonWindow();ApplicationWindow是在Application.h中定義的類,它是一個(gè)QmainWindow的繼承類3. 組件的創(chuàng)立組件的創(chuàng)立需要調(diào)用相應(yīng)組件的類,并在頭文件中包含此類的頭文件或者創(chuàng)立自定義類,繼承以后組件類的功能#include “qpushbutton.h class hello:public Qwidget3. 組件的創(chuàng)立he

7、llo類繼承了Qwidget類的特征,并參加了自定義的特征功能,同樣需要在頭文件中包含此類的頭文件在main.cpp的函數(shù)中需要?jiǎng)?chuàng)立hello類的實(shí)例,或創(chuàng)立QPushButton類的實(shí)例,才可以使用hello h(string);QPushButton hello(“Hello,world!,0);如果組件本身可以作為主窗口,那么無需設(shè)置主窗口。在上例中,下壓按鈕創(chuàng)立時(shí)其構(gòu)造函數(shù)中的第二個(gè)參數(shù)為0,表示按鈕所在窗口為主窗口,不需要設(shè)置主窗口。否那么需要調(diào)用QWidget成員函數(shù)setMainWidget()來進(jìn)行設(shè)置h.setMainWidget(&h);組件創(chuàng)立時(shí)一般是不可見的,這樣的好處

8、在于防止大量組件創(chuàng)立時(shí)造成的屏幕閃爍現(xiàn)象,要使組件可見需要調(diào)用QWidget類的成員函數(shù)show()來顯示組件h.show();4. 事件在X程序中,敲擊鍵盤,鼠標(biāo)指針在窗口中的移動(dòng)或鼠標(biāo)按鍵動(dòng)作等,都是事件在Xt中提供了提供了一種叫做回調(diào)的事件處理方式。它通過翻譯表,將事件映射為相應(yīng)的動(dòng)作,當(dāng)組件得到事件通知,就去表中找出相應(yīng)的動(dòng)作例程進(jìn)行處理。這種機(jī)制需要應(yīng)用程序注冊有關(guān)組件的回調(diào)函數(shù)或普通的事件處理函數(shù),以分發(fā)循環(huán)Xt的事件Qt事件的處理過程:QApplication的事件循環(huán)體從事件隊(duì)列中拾取本地窗口系統(tǒng)事件或其他事件,譯成QEvent(),并送給QObject:event(),最后送

9、給QWidget:event()分別對事件處理其實(shí)在Qt程序中,事件處理的方式也是回調(diào),但與以往所不同的是,事件的發(fā)出和接收采用了信號(hào)signal和插槽slot機(jī)制,無須調(diào)用翻譯表。利用信號(hào)和插槽進(jìn)行對象間的通信是Qt的最主要特征之一。4. 事件當(dāng)對象狀態(tài)發(fā)生改變的時(shí)候,發(fā)出signal通知所有的slot接收signal,盡管它并不知道哪些函數(shù)定義了slot,而slot也同樣不知道要接收怎樣的signalsignal和slot機(jī)制真正實(shí)現(xiàn)了封裝的概念,slot除了接收signal之外和其它的成員函數(shù)沒有什么不同,而且signal和slot之間也不是一一對應(yīng)Signal和Slot的聲明1在Qt程

10、序設(shè)計(jì)中,但凡包含signal和slot的類中都要加上Q_OBJECT的定義,下面的例子給出了如何在一個(gè)類中定義signal和slot:class Student : public QObjectQ_OBJECTpublic:Student() myMark = 0; int mark() const return myMark; public slots:void setMark(int newMark);signals:void markChanged(int newMark);private:int myMark;Signal和Slot的聲明2signal的發(fā)出一般在事件的處理函數(shù)中,利

11、用emit發(fā)出signal,在下面的例子中在在事件處理結(jié)束后發(fā)出signalvoid Student:setMark(int newMark)if (newMark!= myMark) myMark = newMark;emit markChanged(myMark);Signal和Slot的連接1在signal和slot聲明以后,需要使用connect()函數(shù)將它們連接起來。connect()函數(shù)屬于QObject類的成員函數(shù),它能夠連接signal和slot,也可以用來連接signal和signal函數(shù)原形如下:bool connect ( const QObject * sender,

12、const char * signal,const char * member ) const其中第一個(gè)和第三個(gè)參數(shù)分別指出signal和slot是屬于那個(gè)對象或組件Signal和Slot的連接2在使用connect()函數(shù)進(jìn)行來接的時(shí)候,還需要用到SIGNAL()和SLOT()這兩個(gè)宏,使用方法如下:QLabel *label = new QLabel;QScrollBar *scroll = new QScrollBar;QObject:connect( scroll,SIGNAL(valueChanged(int), label, SLOT(setNum(int) );Signal和Sl

13、ot的連接方式1Signal和Slot的連接方式2同一個(gè)信號(hào)連接多個(gè)插槽connect(slider, SIGNAL(valueChanged(int),spinBox,SLOT(setValue(int);connect(slider,SIGNAL(valueChanged(int),this,SLOT(updateStatusBarIndicator(int);多個(gè)信號(hào)連接到同一個(gè)插槽connect(lcd, SIGNAL(overflow(),this,SLOT(handleMathError();connect(calculator, SIGNAL(divisionByZero(),t

14、his, SLOT(handleMathError();Signal和Slot的連接方式3一個(gè)信號(hào)連接到另一個(gè)信號(hào)connect(lineEdit, SIGNAL(textChanged(const QString &),this, SIGNAL(updateRecord(const QString &);取消一個(gè)連接disconnect(lcd,SIGNAL(overflow(),this,SLOT(handleMathError();取消一個(gè)連接不是很常用,因?yàn)镼t會(huì)在一個(gè)對象被刪除后自動(dòng)取消這個(gè)對象所包含的所有的連接退出事件程序退出事件程序,只需要在程序結(jié)束時(shí)返回一個(gè)exec(),例如:

15、return a.exec();其中a為QApplication的實(shí)例,當(dāng)調(diào)用exec()將進(jìn)入主事件的循環(huán)中,直到exit()被調(diào)用或主窗口部件被銷毀整個(gè)Qt程序的執(zhí)行過程實(shí)驗(yàn)步驟1編譯qt/embedded環(huán)境和相關(guān)程序必須使用3.X版本的arm-linux-gcc來進(jìn)行交叉編譯。安裝從ftp或者光盤資料中得到從下載到/root在root的主目錄里面解壓;minjunlocalhost $ tar jxf arm-linux-gcc-3.4.1.tar.bz2 -C /設(shè)置環(huán)境變量將arm-linux-gcc的路徑參加PATH中,更改當(dāng)前用戶的.bashrc文件,在該文件中增加一行腳本:e

16、xport PATH=:$PATH使環(huán)境變量立即生效minjunlocalhost $ source .bashrc實(shí)驗(yàn)步驟1解壓縮qt-embedded-env.tar.gz 該文件可以從下載。針對redhat9的環(huán)境,將這次實(shí)驗(yàn)所需的tmake-1.13、和預(yù)先編譯后,打包成。實(shí)驗(yàn)時(shí)只要在/root目錄下解壓縮后設(shè)置相關(guān)環(huán)境變量,就可以進(jìn)行qt/embedded程序的開發(fā)。實(shí)驗(yàn)步驟2安裝qt embedded開發(fā)環(huán)境在當(dāng)前用戶的主目錄內(nèi),解壓在解壓后會(huì)得到兩個(gè)目錄qt/ 和 qtopia_env/;其中qtopia_env/下面的文件是用來在開發(fā)程序時(shí)配置環(huán)境變量的qvfb.sh設(shè)置PC上

17、的X11 qvfb環(huán)境,包括需要的庫和tmake環(huán)境變量等target.sh 設(shè)置交叉編譯時(shí)需要的環(huán)境變量,包括tmake的環(huán)境變量等其中qt/目錄下有三個(gè)子目錄,分別是qt-2.3.2 qt-2.3.10 編譯X11 qvfb環(huán)境下程序所需要的qte環(huán)境qt-embedded-2.3.10 交叉編譯ARM開發(fā)板上程序所需要的qte環(huán)境實(shí)驗(yàn)步驟3編寫運(yùn)行qvfb環(huán)境下的程序設(shè)置環(huán)境變量相關(guān)的環(huán)境變量設(shè)置在qtopia_env/目錄下的qvfb.sh中minjunlocalhost qtopia_env$ source qvfb.sh運(yùn)行qvfb程序minjunlocalhost qt-2.3.

18、10$ qvfb & 默認(rèn)啟動(dòng)時(shí),qvfb窗口大小為240320可以在啟動(dòng)時(shí)指定參數(shù):qvfb -width 640 -height 480 &實(shí)驗(yàn)步驟3編寫運(yùn)行qvfb環(huán)境下的程序接著,可以運(yùn)行里面的example程序minjunlocalhost launcher$ launcher -qws 實(shí)驗(yàn)步驟3編寫運(yùn)行qvfb環(huán)境下的程序下面通過編寫一個(gè)“Hello Embedded程序來了解Qt。首先新建一個(gè)目錄(如hello):在hello/目錄下建立如下文件:#include #include int main(int argc, char *argv)QApplication app(a

19、rgc,argv);QLabel *hello = new QLabel(hello Qt/Embedded!,0);app.setMainWidget(hello);hello-show();return app.exec();分析hello.cpp程序第1 行和第2 行包含了兩個(gè)頭文件,這兩個(gè)頭文件中包含了QApplication 和 QLabel類的定義。第5 行創(chuàng)立了一個(gè)QApplication 對象,用于管理整個(gè)程序的資源,它需要2 個(gè)參數(shù),因?yàn)镼t 本身需要一些命令行的參數(shù)。第6 行創(chuàng)立了一個(gè)用來顯示Hello Qt/Embedded!的部件。在Qt 中,部件是一個(gè)可視化用戶接口,

20、按鈕、菜單、滾動(dòng)條都是部件的實(shí)例。部件可以包含其它部件,例如,一個(gè)應(yīng)用程序窗口通常是一個(gè)包含QMenuBar、QToolBar、QStatusBar 和其它部件的一個(gè)部件。在QLabel 函數(shù)中的參數(shù)0 表示,這是一個(gè)窗口而不是嵌入到其它窗口中的部件。第7 行設(shè)置hello 部件為程序的主部件,當(dāng)用戶關(guān)閉主部件后,應(yīng)用程序?qū)?huì)被關(guān)閉。如果沒有主部件的話,即使用戶關(guān)閉了窗口程序也會(huì)在后臺(tái)繼續(xù)運(yùn)行。第8 行使hello 部件可視,一般來說部件被創(chuàng)立后都是被隱藏的,因此可以在顯示前根據(jù)需要來訂制部件,這樣的好處是可以防止部件創(chuàng)立所造成的閃爍。第9 行把程序的控制權(quán)交還給Qt,這時(shí)候程序進(jìn)入就緒模式,

21、可是隨時(shí)被用戶行為激活,例如點(diǎn)擊鼠標(biāo)、敲擊鍵盤等。實(shí)驗(yàn)步驟3編寫運(yùn)行qvfb環(huán)境下的程序程序的編譯和運(yùn)行在配置好環(huán)境變量后,要在qvfb中運(yùn)行程序需要如下的步驟1. 生成工程文件.prorootlocalhost $ progen -t app.t -o 2. 生成Makefile文件rootlocalhost $ tmake -o Makefile 3. 編譯rootlocalhost $ make4. 運(yùn)行(確保qvfb 在后臺(tái)運(yùn)行)rootlocalhost $ ./hello -qws實(shí)驗(yàn)步驟4用QT Designer設(shè)計(jì)圖形界面使用Qt Designer可以方便地設(shè)計(jì)出圖形界面,一般

22、需要如下的步驟創(chuàng)立和初始化子部件 設(shè)置子部件的布局 設(shè)置Tab鍵的次序 建立信號(hào)與插槽的連接 下面通過一個(gè)簡單的例子來體驗(yàn)一下Qt Designer的使用涉及的控件:一個(gè)dial控件(上面的控件)一個(gè)Slider控件(下面的控件)實(shí)現(xiàn)的功能拖動(dòng)slider時(shí),dial中的指針會(huì)隨著轉(zhuǎn)動(dòng)用鼠標(biāo)拖動(dòng)dial中的指針的時(shí)候,slider指示會(huì)變化實(shí)驗(yàn)步驟4用QT Designer設(shè)計(jì)圖形界面啟動(dòng)Qt Designer (在$QT2DIR/bin里面,QT2DIR即所在的目錄)rootlocalhost test# $QT2DIR/bin/designer新建一個(gè)dialog實(shí)驗(yàn)步驟4用QT Desi

23、gner設(shè)計(jì)圖形界面將所需的控件參加到dialog中調(diào)整布局,使用工具欄上面的布局的控件進(jìn)行調(diào)整,右圖使用實(shí)驗(yàn)步驟4用QT Designer設(shè)計(jì)圖形界面建立信號(hào)與插槽的連接 首先是slider發(fā)送signal、dial接收的情況點(diǎn)擊signal/slot的圖標(biāo)在鼠標(biāo)左鍵被按下的情況下連接slider和dial控件,出現(xiàn)如下對話框在signal欄中選擇vlaueChanged(int),在slot欄中選擇setValue(int)然后點(diǎn)擊connect按鈕得到連接同理,可以得到dial發(fā)送信號(hào),而slider接收的情況實(shí)驗(yàn)步驟4用QT Designer設(shè)計(jì)圖形界面保存ui文件將生成的ui文件保存

24、到工程所在目錄中(請專門建立一個(gè)工程的目錄,里面不要有無關(guān)的文件),比方存為form.ui根據(jù)ui文件編寫包含main函數(shù)的cpp文件內(nèi)容如下#include #include “form.h“ /*頭文件名稱與ui文件名稱相同*/int main(int argc, char* argv) QApplication app(argc, argv); Form1 form; /*默認(rèn)創(chuàng)立的類是Form1,可以在Designer的屬性窗口中進(jìn)行修改*/ app.setMainWidget(&form); form.show(); return app.exec();實(shí)驗(yàn)步驟5編譯和運(yùn)行程序?yàn)閝vfb編譯程序首先設(shè)置環(huán)境變量(qtopia_env/目錄下的qvfb.sh):rootlocalhost: test sour

溫馨提示

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

評(píng)論

0/150

提交評(píng)論