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

下載本文檔

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

文檔簡介

1、嵌入式系統(tǒng)實驗實驗五實驗目的實驗內容Qt介紹Qt編程特點實驗步驟實驗目的了解在Linux下安裝Qt以及Qt/Embedded的根本步驟學會在Qt/E平臺下使用Virtual framebuffer顯示程序結果實驗內容在Linux系統(tǒng)的宿主PC下,編譯和使用Qt/E平臺在Qt/E平臺下編譯和運行一個程序使用Virtual framebuffer顯示運行結果Qt 簡介Qt是Trolltech公司的標志性產品,是一個跨平臺的C+圖形用戶界面GUI工具包Qt應用程序接口與工具兼容于所有支持平臺,讓開發(fā)員們掌握一個應用程序接口,便可執(zhí)行與平臺非相關的應用開發(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對不同平臺的專門API進行了專門的封 裝文件處理,網絡等Qt 特征1面向對象Qt具有模塊設計和注重軟件構件或元素的可重用行的特點構件支持Qt提供信號signal和插槽slot概念,這是一種類型平安的方法,它允許回調,并支持對象之間在彼此不知道對方信息的情況下進行合作,這使得Qt非常適合于真正的構件編程友好的聯(lián)機幫助Qt提供了大量的聯(lián)機參考文檔,有超文本HTML方式,也有Unix幫助頁man手冊頁和補充說明。并且對于初學者,其中的指

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

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

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

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

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

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

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

10、序設計中,但凡包含signal和slot的類中都要加上Q_OBJECT的定義,下面的例子給出了如何在一個類中定義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ā)出一般在事件的處理函數中,利

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

12、const char * signal,const char * member ) const其中第一個和第三個參數分別指出signal和slot是屬于那個對象或組件Signal和Slot的連接2在使用connect()函數進行來接的時候,還需要用到SIGNAL()和SLOT()這兩個宏,使用方法如下: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同一個信號連接多個插槽connect(slider, SIGNAL(valueChanged(int),spinBox,SLOT(setValue(int);connect(slider,SIGNAL(valueChanged(int),this,SLOT(updateStatusBarIndicator(int);多個信號連接到同一個插槽connect(lcd, SIGNAL(overflow(),this,SLOT(handleMathError();connect(calculator, SIGNAL(divisionByZero(),t

14、his, SLOT(handleMathError();Signal和Slot的連接方式3一個信號連接到另一個信號connect(lineEdit, SIGNAL(textChanged(const QString &),this, SIGNAL(updateRecord(const QString &);取消一個連接disconnect(lcd,SIGNAL(overflow(),this,SLOT(handleMathError();取消一個連接不是很常用,因為Qt會在一個對象被刪除后自動取消這個對象所包含的所有的連接退出事件程序退出事件程序,只需要在程序結束時返回一個exec(),例如:

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

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

17、的X11 qvfb環(huán)境,包括需要的庫和tmake環(huán)境變量等target.sh 設置交叉編譯時需要的環(huán)境變量,包括tmake的環(huán)境變量等其中qt/目錄下有三個子目錄,分別是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)境實驗步驟3編寫運行qvfb環(huán)境下的程序設置環(huán)境變量相關的環(huán)境變量設置在qtopia_env/目錄下的qvfb.sh中minjunlocalhost qtopia_env$ source qvfb.sh運行qvfb程序minjunlocalhost qt-2.3.

18、10$ qvfb & 默認啟動時,qvfb窗口大小為240320可以在啟動時指定參數:qvfb -width 640 -height 480 &實驗步驟3編寫運行qvfb環(huán)境下的程序接著,可以運行里面的example程序minjunlocalhost launcher$ launcher -qws 實驗步驟3編寫運行qvfb環(huán)境下的程序下面通過編寫一個“Hello Embedded程序來了解Qt。首先新建一個目錄(如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 行包含了兩個頭文件,這兩個頭文件中包含了QApplication 和 QLabel類的定義。第5 行創(chuàng)立了一個QApplication 對象,用于管理整個程序的資源,它需要2 個參數,因為Qt 本身需要一些命令行的參數。第6 行創(chuàng)立了一個用來顯示Hello Qt/Embedded!的部件。在Qt 中,部件是一個可視化用戶接口,

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論