QT的進一步學(xué)習(xí) |
|
|
|
本文收錄了互聯(lián)網(wǎng)上關(guān)于Qt,、Qte和Qtopia的介紹,、開發(fā)環(huán)境及其搭建、應(yīng)用編程等相關(guān)文檔資源,,在實際學(xué)習(xí)過程中還要多參考Qt自帶的幫助
文檔,、Qt和Qtopia中文論壇以及Trolltech公司網(wǎng)站的相關(guān)資料。希望能在前人的經(jīng)驗和官方資料的指導(dǎo)下,,通過不斷實踐來加深自己的認(rèn)識和理
解,。
QT簡體中文:http://www./qt.html,包括
Qt簡體中文文檔
,、
Qt/Qtopia中文論壇
,、
Trolltech公司
、
Qt中心(英文)
,、
Qt論壇(英文)
,、
Qt季刊(英文)
和
The Independent Qt Tutorial(在線英文電子書)
等資源的鏈接。
網(wǎng)絡(luò)文章收錄:
QT簡介:
[url=#qthistory]QT簡史[/url]
,、
QT/QTE概述
,;
QT開發(fā)概覽:
[url=#devintro01]LINUX系統(tǒng)中QT(qtopia)平臺開發(fā)說明(文末有Qtopia應(yīng)用程序的目錄樹)[/url]
、
[url=#devintro02]基于Qt/Embedded和Qtopia的GUI設(shè)計[/url]
,;
Qte/Qtopia的編譯:
齊亮寫的Qtopia安裝文檔
(包括PDA和Phone版本,,還有Qtopia的啟動腳本);
本站資料:
Qtopia開發(fā)及應(yīng)用平臺的搭建
,、
Build Qtopia for x86
,、
Build Qtopia for arm
;
[url=#insdev]嵌入式工具Qt/Qtopia的安裝與使用[/url]
(文章最后簡要介紹了Qt應(yīng)用開發(fā)過程),;
[url=#problem]交叉編譯Qtopia可能碰到的問題及解決[/url]
;
Qt的信號和槽機制:
信號和槽官方文檔(中文),;
Qt的信號和槽機制介紹(IBM學(xué)習(xí)區(qū))
,;
[url=#notes]Signals and Slots學(xué)習(xí)筆記[/url]
;
[url=#qtintro]Qt的信號和槽[/url]
;
Qt的內(nèi)部進程通信機制
,。
QT簡史
[url=#indexdir]Return to the Top[/url]
[來源]http://www-128.ibm.com/developerworks/cn/linux/guitoolkit/qt/overview/
于明儉
, 自由撰稿人
2000 年 11 月 01 日
Qt
是一個跨平臺的 C++ 圖形用戶界面庫,,由挪威 TrollTech 公司出品,目前包括Qt,, 基于 Framebuffer 的 Qt
Embedded,,快速開發(fā)工具 Qt Designer,國際化工具 Qt Linguist 等部分 Qt 支持所有 Unix 系統(tǒng),,當(dāng)然也包括
Linux,,還支持 WinNT/Win2k,Win95/98 平臺,。
Trolltech 公司在 1994 年成立,,但是在 1992 年,成立
Trolltech 公司的那批程序員 就已經(jīng)開始設(shè)計 Qt 了,,Qt
的第一個商業(yè)版本于 1995 年推出然后 Qt 的發(fā)展就很快了,,下面是 Qt
發(fā)展史上的一 些里程碑:
- 1996 Oct KDE 組織成立
- 1998 Apr 05 Trolltech 的程序員在 5 天之內(nèi)將 Netscape5.0 從
Motif 移植到 Qt 上 - 1998 Apr 08 KDE Free Qt 基金會成立
- 1998 Jul 09 Qt 1.40 發(fā)布
- 1998 Jul 12 KDE 1.0 發(fā)布
- 1999 Mar 04 QPL 1.0 發(fā)布
- 1999 Mar 12 Qt 1.44 發(fā)布
- 1999 Jun 25 Qt 2.0 發(fā)布
- 1999 Sep 13 KDE 1.1.2 發(fā)布
- 2000 Mar 20 嵌入式 Qt 發(fā)布
- 2000 Sep 06 Qt 2.2 發(fā)布
- 2000 Oct 05 Qt 2.2.1 發(fā)布
- 2000 Oct 30 Qt/Embedded 開始使用 GPL 宣言
- 2000 Sep 04 Qt free edition 開始使用 GPL
基本上,Qt 同 X Window 上的 Motif,,Openwin,,GTK
等圖形界 面庫和 Windows 平臺上的 MFC,OWL,,VCL,,ATL
是同類型的東西,但是 Qt 具有下列優(yōu)點:
優(yōu)良的跨平臺特性:
Qt支持下列操作系統(tǒng): Microsoft Windows 95/98,, Microsoft Windows
NT,, Linux, Solaris,, SunOS,, HP-UX, Digital UNIX (OSF/1,,
Tru64),, Irix, FreeBSD,, BSD/OS,, SCO, AIX, OS390,,QNX
等等,。
面向?qū)ο?br>
Qt 的良好封裝機制使得 Qt
的模塊化程度非常高,可重用性較好,,對于用戶開發(fā)來說是非常 方便的,。
Qt 提供了一種稱為 signals/slots 的安全類型來替代
callback,,這使得各個元件 之間的協(xié)同工作變得十分簡單,。
豐富的 API
Qt 包括多達(dá) 250 個以上的 C++ 類,還替供基于模板的 collections,,
serialization,, file, I/O device,, directory management,,
date/time 類。甚至還包括正則表達(dá)式的處理 功能,。
支持 2D/3D 圖形渲染,,支持 OpenGL
大量的開發(fā)文檔
XML 支持
但是真正使得 Qt 在自由軟件界的眾多 Widgets (如
Lesstif,Gtk,,EZWGL,,Xforms,fltk 等等)中脫穎而出的還是基于 Qt
的重量級軟件 KDE ,。 有趣的是,,KDE 也是使得 Trolltech
公司承受巨大壓力的一個原因。下面我們將來看看這場 著名的自由軟件圣戰(zhàn)
-- "KDE/QT .VS. Gnome/Gtk" 是怎么發(fā)生的,。
在 Unix 的圖形界面一向是以 MIT 的 X Window
系統(tǒng)為標(biāo)準(zhǔn),, 可是在商業(yè)應(yīng)用上有兩大流派,一派是以 Sun 公司領(lǐng)導(dǎo)的
Openlook 陣營,,一派是 IBM/HP 領(lǐng)導(dǎo)的OSF (Open Software Foundation)
的 Motif,, 雙方經(jīng)過多年競爭之后, Motif 最終
勝出,,成為最普遍使用的界面庫,, 后來雙方又妥協(xié)出一個 CDE(Common
Desktop Enviroment) 作為一個標(biāo)準(zhǔn)的圖形界面。 但是 Motif/CDER
的價格非常昂貴,,在這同時微軟的 Windows 圖 形界面發(fā)展速度非??欤?br>
Unix 界的后起之秀 Linux 也急需一個可靠并且免費的圖形界面,。
1996 年 10 月,,由開發(fā)圖形排版工具Lyx的德國人
Matthias Ettrich 發(fā)起了 KDE 計劃。 KDE 的全稱為 K Desktop
Environment,可以看出是針對 CDE,。 KDE 本身 是采用 GPL 宣言的,,但是
KDE 卻是使用 Qt 來作為其底層庫,因為當(dāng)時 Qt 已經(jīng)將其 Unix 版
本自由發(fā)布了,,但是 Qt 并不遵循 GPL,, 因此 KDE
被很多自由軟件的作者攻擊,認(rèn)為利用非自 由軟件開發(fā)違背了 GPL
的精神,,于是 GNU 的狂熱信徒兵分兩路,,一路是去制作 Harmonny,試
圖重寫一套兼容于 Qt 的替代品,,另一路是由一個 26 歲的墨西哥程序員
Miguel De Icaza 領(lǐng)導(dǎo) 下重新開發(fā)一套叫 GNOME(GNU Network Object
Enviroment)來替代 KDE,。
由于 Linux 界的老大 RedHat 不喜歡 KDE/Qt
的版權(quán),因此 RedHat 甚至專門派出了幾個全職程序員來加入 GNOME
進行開發(fā)工作,,于是一場同 Motif VS Openlook 相
似的圣戰(zhàn)就這么打起來了,。 Trolltech 為了 KDE 曾數(shù)次修改 Qt
的版權(quán),從成立 KDE Free Qt 基 金會到采用 QPL,,可謂是費盡心機,,但是
GNOME 采用的 GTK 一開始就是完全的 GPL,因此在這個方 面 GNOME
有一定的優(yōu)勢,,加上 Qt/KDE 采用 C++ 開發(fā),,入門的門檻比較高,而
GTK/Gnome 采用 C,, 因此 GNOME 吸引了更多的自由軟件開發(fā)者,,但是 KDE
畢竟先走了一步, 推出的 KDE1.1.2 十分穩(wěn)定,, 而當(dāng)時急忙中推出的
GNOME1.0 的系統(tǒng)穩(wěn)定性奇差,,有人甚至笑稱 GNOME1.0 還沒有 KDE 1.0
Alpha 穩(wěn)定。但是 GNOME 后來發(fā)展比較快,,大有迎頭趕上的勢頭,。
當(dāng)時雙方的開發(fā)者在網(wǎng)絡(luò) 上炒得天翻地覆,連 Linux 之父 Linus
只是說了一句喜歡用 KDE 都倍受指責(zé),。
戰(zhàn)爭到了第三個年頭,,也就是2000年,可謂是風(fēng)云突變,,一個接
一個重大的事件先后發(fā)生: 首先是一批從 Apple
公司出來的工程師成立了一個叫 Eazel 的公司替 GNOME
設(shè)計界面,,然后是一批 GNOME 程序員成立了一個 Helix Code 公司替 GNOME
提供商業(yè)支持,而大家期待以久的 KDE 2.0
也終于發(fā)布了,,這恐怕是目前最為龐大的自由 軟件了之一,, 除了 KDE
本身,,還包括 Koffice 套件,和集成開發(fā)環(huán)境 Kdevelop 等等大批軟件,,其
主力軟件 Kounqueror 也是第一個可以同微軟的 Internet Exploer
相抗衡的瀏覽器,。 而 Sun 公司,Red Hat 公司,, Eazel 公司,,Helix Code
等一批公司成立了一個GNOME 基金會, Sun 還宣布將把重量級辦公軟件
Star office 同 GNOME 集成,, Trolltech 公司自然不能坐以 待斃,,于今年
10 月 4 日將 Qt 的 free edition 變?yōu)?GPL 宣言,徹底解決了 KDE
的版權(quán)問題,, 又推出了嵌入式 Qt ,,給了 GNOME
陣營一個有力的回?fù)簟?br>
到現(xiàn)在為止,這場戰(zhàn)爭還在繼續(xù),,
相信我們不能很快看到結(jié)果。一般說來,, 目前 GNOME
吸引的公司比較多,,但是 KDE/Qt 的開發(fā)的效率和質(zhì)量比 GNOME 高,而且在
Office/嵌入式 環(huán)境中先走一步,,在一定時間內(nèi)還將處于優(yōu)勢地位,。
那么對于用戶來說,如何在 Qt/GTK
中作出選擇呢?一般來說,,如果用戶使用
C++,,對庫的穩(wěn)定性,健壯性要求比較高,,并且希望跨平臺開發(fā)的話,,那么使用
Qt 是較好的選擇, 但是值得注意的是,,雖然 Qt 的 Free Edition 采用了
GPL 宣言,,但是如果你開發(fā) Windows 上的 Qt 軟件或者是 Unix
上的商業(yè)軟件,還是需要向 Trolltech 公司支付版權(quán)費用的,。
LINUX系統(tǒng)中QT(qtopia)平臺開發(fā)說明
[url=#indexdir]Retrun to Top[/url]
=================================
黃德智(
[email protected]
)
V:1.0
日期:20060305
QT 版本 :20060106V2
一,、開發(fā)包的獲取
================
最新的qtopia開發(fā)包名稱為:qtopia_dev20060106V2.tar.gz;
當(dāng)前版本為20060106V2,,大小大約為 246M,。
當(dāng)前和后續(xù)版本也可在 東信 的FTP網(wǎng)站上下載得到.
二、開發(fā)環(huán)境的搭建
==================
qtopia開發(fā)包運行于LINUX操作系統(tǒng)上,,LINUX要求內(nèi)核版本為2.4.18或以上,。安裝LINUX操作系統(tǒng),,
如果只是在PC機上進行模擬器上的開發(fā)和交叉編譯,,可將LINUX安裝到虛擬機上。將LINUX安裝到虛擬機上,,
建議硬盤空間最少分配6G,,因為開發(fā)環(huán)境的搭建需要很大空間。
1,、qtopia開發(fā)包的安裝步驟:
(1),、將qtopia_dev.tar.gz放到/opt/目錄下
建議放在/opt/目錄下,如果需要將開發(fā)包放到其他的目錄,,則解壓后需要修改
qtopia-phone-2.1.1/src/下的config.pri文件,。
(2)、用命令tar解壓
在LINUX終端中CD到/opt/目錄下,,輸入命令 tar -zxf qtopia_dev.tar.gz (回車),,
幾分鐘后解壓結(jié)束,出現(xiàn)命令提示符,,如果報找不到什么目錄或找不到什么文件,輸入命令“df -m”
查看硬盤使用情況,,一般原因是硬盤空間不足,,解壓失敗,,刪除硬盤上不需要的文件或重新安裝LINUX操作
系統(tǒng),把分配硬盤空間更大,。
(3),、解壓后生成的目錄為qtopia_dev
2、交叉編譯工具的安裝步驟:
(1),、將cross2compiler.tar.gz放到/opt/目錄下
(2),、用命令tar -zxf cross2compiler.tar.gz 解壓
(3),、解壓后生成的目錄為debugdir
交叉編譯工具的安裝是為了編譯出在真機上運行的可執(zhí)行文件,,如果只是在模擬器上開發(fā),,可不
進行交叉工具的安裝,。
三,、模擬器上開發(fā)
================
1,、配置文件和全局變量的設(shè)置:
(1)、將.../qtopia_dev/.../x86/Settings目錄放到/root/目錄下,,如果已經(jīng)有/root/Settings目錄,,
則進行覆蓋。
(2),、進入qtopia_dev/.../.../x86/目錄,。(中間目錄省略)
(3)、運行 ./setenv 設(shè)置環(huán)境變量,,或source setenv命令,。
2、編譯例子工程:
在目錄.../qtopia_dev/20060106V1102/x86/qtopia-phone-2.1.1/examples/application/下有一個名為
application的示例工程,,對該工程進行編譯和安裝,,可在模擬器中看到運行效果。
編譯步驟:
(1),、進入qtopia_dev/.../.../x86/qtopia-phone-2.1.1/examples/application目錄,;
(2)、運行qmake生成Makefile 文件,;
(3),、運行make install 進行編譯和安裝。
3,、模擬器上查看運行效果:
(1)、進入.../qtopia_dev/20060106V1102/x86/目錄
(2),、運行./rn.dat 啟動模擬器
4,、各個文件安裝路徑:
(1)、所有編譯后的程序放在
qtopia_dev/.../.../x86/qtopia-phone-2.1.1/image/opt/Qtopia/bin/目錄下;
(2),、程序相應(yīng)的desktop文件放在
qtopia_dev/.../.../x86/qtopia-phone-2.1.1/image/opt/Qtopia/apps/Application/目錄下
(3),、所有的程序圖標(biāo)放在qtopia_dev/.../.../x86/pia-phone-2.1.1/image/opt/Qtopia/pics/程序名/目錄下
5、示例工程中的各個文件
(1),、application.pro文件
該文件中指定工程中用到的各個文件,,文件包括:源代碼文件(.c .cpp .h)、資源文件名,、目標(biāo)文件名,、
desktop文件及路徑、圖標(biāo)文件及路徑,、幫助文件及路徑,。
qmake命令在執(zhí)行過程中訪問application.pro文件將生成Makefile文件。
(2),、example.desktop文件
該文件將安裝到模擬器和真機上,,為了在運行時找到工程的各個文件,。
(3)、example.control文件
文件中指定了工程的可執(zhí)行文件路徑,、desktop文件路徑,、幫助文件路徑和圖標(biāo)文件路徑。
這個文件我現(xiàn)在還沒有搞清楚:)
(4),、examplebase.ui文件
該文件中以XML的格式定義了可視窗口上的各個部件,。
(5)、其它文件
example.html和Example.png分別是工程的幫助文件和圖標(biāo)文件,。
6,、建立自己的工程
(1)、在示例工程的基礎(chǔ)上建立自己的工程:
新建一個自己工程的目錄,,將示例工程中的相關(guān)文件復(fù)制到該目錄,,在示例工程的基礎(chǔ)上進行修改。
需要復(fù)制的文件有:main.cpp,、application.pro,、example.control、example.cpp,、example.h,、example.desktop、
examplebase.ui,、Example.png,、example.html。
(2),、修改事項:
application.pro文件:
A,、“application.pro”文件以.pro為擴展名,文件名要和它所在的目錄名相同,;
B,、11行,寫上所有工程中用到頭文件,,文件名之間用空格隔開,;
C、12行,,寫上所有工程中用到.c或.cpp文件,,文件名之間用空格隔開;
D,、13行,,可視窗口文件名;
E,、14行,,生成可執(zhí)行文件名(目標(biāo)文件名),;
F、18行,,.desktop文件名,;
G、22行,,圖標(biāo)文件名,;
H、23行,,圖標(biāo)路徑名,,以目標(biāo)文件名為目錄名;
I,、26行,,說明文件名;
.desktop文件
A,、7行,,可執(zhí)行文件名;
B,、8行,,圖標(biāo)文件名;
.ui文件,,該文件可用QT開發(fā)環(huán)境修改,,也可用文本編輯器修改,
A,、第2行,,ExampleBase,“ExampleBase”可修改,,但一定要與example.h文件的25行父類名稱一致;
main.cpp文件
A,、該文件名不修改,;
B、21行,,修改包含的頭文件名,;
C、24行,,修改類名,;
(3)、編譯自己的工程
A,、生成Makefile文件,,在工程的目錄下,,運行qmake命令;
B,、編譯,,在工程的目錄下,運行make命令,;
C,、安裝,在工程的目錄下,,運行make install命令,;
四、為真機上運行進行編譯
========================
將代碼用arm編譯器進行編譯,,目標(biāo)文件就可在真機上運行,。
1、必須進行交叉編譯工具的安裝,;
2,、將工程目錄復(fù)制到.../qtopia_dev/20060106V1102/arm/qtopia-phone-2.1.1/目錄下;
3,、編譯,;
五、將文件安裝到真機上
======================
1,、設(shè)備間的軟件連接:
連接步驟:
(1),、連接好個連線
(2)、啟動PC到LINUX系統(tǒng)中
(3),、關(guān)閉防火墻(service iptables stop)
(4),、掛載進QT的開發(fā)包(mount /dev/hda4 /mnt/win)
(5)、手動加載usbdnet.o(進入/mnt/win目錄下,,執(zhí)行install),,并在終端確認(rèn)模塊已經(jīng)加載
(6)、啟動(重起)nfs(service nfs restart)
(7),、啟動minicom(#minicom)
(8),、到/home/目錄下,執(zhí)行腳本pc_linux
(9),、在終端啟動USB設(shè)備(ifconfig usb0 192.168.254.1 up)
(10),、在minicom窗口中執(zhí)行/home/目錄下的linuxrc_run腳本
(11)、在minicom窗口中執(zhí)行/home/目錄下的腳本pc_linux
(12),、檢查目錄/mnt/,,是否和目錄/opt/p2fs下的內(nèi)容一致,若一致,則成功
這里提供幾個診斷連接成功的方法:
pc啟動候,,通過lsmod|grep usbdnet看看模塊是否存在,,如果不存在,請手動通過./install加載
如果以上都正確,,連接手機,,如果ifconfig -a 能看到設(shè)備而ifconfig 看不到,請按照文檔設(shè)置ip并激活,。
2,、文件安裝目錄:
將編譯好的程序、desktop文件和圖標(biāo)放在手機上/opt/Qtopia/各自對應(yīng)的目錄下,。
(1),、所有編譯后的程序放在
qtopia_dev/.../arm/qtopia-phone-2.1.1/image/opt/Qtopia/bin/目錄下
(2)、程序相應(yīng)的desktop文件放在
qtopia_dev/.../arm/qtopia-phone-2.1.1/image/opt/Qtopia/apps/Application/目錄下
(3),、所有的程序圖標(biāo)放在
qtopia_dev/.../arm/qtopia-phone-2.1.1/image/opt/Qtopia/pics/程序名/ 目錄下
3,、重起手機。
六,、手機目錄:
/ (根目錄)
|----bin
|----lib
|----home
|----mnt (對應(yīng)于PC機的/opt/p2fs目錄,,該目錄結(jié)構(gòu)可隨意)
|
|----opt
| |----Qtopia
| |----bin (放編譯后的程序)
| |----etc
| |----pics (放圖標(biāo)文件)
| |----apps
| |--Applications (放desktop文件)
|
|----Applications (該目錄結(jié)構(gòu)任意,可存放工程自己的文件)
結(jié)束
====
[url=#indexdir]Return to Top[/url]
基于Qt/Embedded和Qtopia的GUI設(shè)計
王麗潔,,習(xí)勇,,魏急波
(國防科技大學(xué) 電子科學(xué)與工程學(xué)院 湖南省 長沙市 410073)
摘要:介紹了Qt/Embedded和Qtopia的體系結(jié)構(gòu)及其交叉編譯過程與安裝過程,重點講述了如何實現(xiàn)Qt/Embedded下的應(yīng)用程序以及如何將應(yīng)用程序移植到Qtopia桌面系統(tǒng),。本文介紹的方法在筆者的開發(fā)平臺上都做過驗證,。
關(guān)鍵詞:嵌入式系統(tǒng); GUI;Qt/Embedded; Qtopia; 交叉編譯
中圖分類號:TP368
Design of GUI Based on Qt/Embedded and Qtopia
Wang Li-Jie, Xi Yong, Wei Ji-Bo
(School
of Electronic Science and Engineering, National
University of Defense Technology, Changsha 410073, China)
Abstract: In this paper,
the architecture, cross-compiling and installation of Qt/Embedded and Qtopia
are introduced. Especially, we focus on how to implement an application program
based on Qt/Embedded and how to port an existing application to Qtopia desktop
system. The methods introduced in the paper have all been validated in our development
platform.
Key
words: Embedded System; GUI; Qt/Embedded; Qtopia;
Cross-Compiling
1 引言
隨著當(dāng)前各種手持設(shè)備,、無線設(shè)備及信息家電等嵌入式產(chǎn)品的迅猛發(fā)展,,相應(yīng)的嵌入式軟硬件設(shè)計技術(shù)也在發(fā)生深刻的變化。如今,,越來越多的嵌入式終端需要一個
圖形化的人機接口界面(GUI),,良好的人機接口界面是嵌入式系統(tǒng)設(shè)計的一個關(guān)鍵技術(shù),能夠極大地提高人機交互的效率,。本文詳細(xì)闡述了在自行開發(fā)的嵌入式
主板上實現(xiàn)某平臺的圖形顯示終端過程,。
2系統(tǒng)平臺介紹
根據(jù)系統(tǒng)設(shè)計需求,本文目的是實現(xiàn)一個具有圖形接口界面的嵌入式顯示終端,,該系統(tǒng)使用嵌入式系統(tǒng)設(shè)計技術(shù)。硬件上,,使用自行開發(fā)的基于Samsung
S3C2440A
CPU的目標(biāo)板,,該CPU使用arm920T內(nèi)核,其主頻可達(dá)400Mhz;在軟件上,,選擇嵌入式linux為操作系統(tǒng),,因為它源碼開放,而且穩(wěn)定性與安
全性較高,。
(uboot),、 設(shè)備驅(qū)動(包括幀緩存fb)、嵌入式Linux內(nèi)核,、文件系統(tǒng)(yaffs),、基于QT/Embedded和Qtopia的用戶圖形界面以及應(yīng)用程序組成,系統(tǒng)平臺結(jié)構(gòu)如圖(1)所示,。
圖(1) 系統(tǒng)平臺軟件結(jié)構(gòu)圖
3
Qt/Embedded和Qtopia
介紹及其開發(fā)環(huán)境的建立
目前嵌入式Linux的主流GUI系統(tǒng)主要有MiniGUI,、Microwindows、OpenGUI,、Qt/Embedded,,這些GUI在接口定
義、體系結(jié)構(gòu),、功能特性存在很大差別,,采取的技術(shù)路線也有所不同[1]。MiniGUI是建立在比較成熟的圖形引擎之上,,開發(fā)的重點在于窗口系統(tǒng),,其小巧
精致并且盡量與Win32兼容。MicroWindows目前開發(fā)的重點在底層的圖形引擎,,窗口系統(tǒng)和圖形接口方面功能比較欠缺,,與Win32和X
Windows窗口系統(tǒng)保持兼容,提供了相對完善的圖形功能,。OpenGUI基于一個用匯編實現(xiàn)的x86圖形內(nèi)核,,提供了一個高層的C/C++圖形/窗口接口,它的資源消耗小,,可移植性差,,不支持多進程。
Qt/Embedded是一個多平臺的C++圖形用戶界面應(yīng)用程序框架,,其對象容易擴展,,可移植性好,支持多個GUI平臺的交互開發(fā)[2,3]?,F(xiàn)
在,,Qt/Embedded被廣泛地應(yīng)用于各種嵌入式產(chǎn)品和設(shè)備中,從消費電器(如智能手機,、機頂盒)到工業(yè)控制設(shè)備(如醫(yī)學(xué)成像設(shè)備,、移動信息系統(tǒng)
等)。因此本文選擇Qt/Embedded為本系統(tǒng)的GUI。
(1) Qt/Embedded和Qtopia體系結(jié)構(gòu)
Qt/Embedded是Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本,,與X11版本的Qt在最大程度上接口兼容,,采用幀緩存
(framebuffer)作為底層圖形接口。Qt/Embedded類庫完全采用C++封裝,,并且有著豐富的控件資源以及較好的可移植性,,大范圍的Qt
/Embedded API可用于多種開發(fā)項目。Qt/Embedded的實現(xiàn)結(jié)構(gòu)如圖(2)所示:
圖(2) Qt/Embedded實現(xiàn)結(jié)構(gòu)
Qt/Embedded的底層圖形引擎基于framebuffer,。
framebuffer是一種驅(qū)動程序接口,,它將顯示設(shè)備抽象為幀緩沖區(qū)[4]。該驅(qū)動程序的設(shè)備文件一般是/dev/fb0,、/dev/fb1等,。對用
戶而言,它和/dev下的其他設(shè)備沒有什么區(qū)別,,用戶可以把framebuffer看成一塊內(nèi)存,,既可以從這塊內(nèi)存中讀取數(shù)據(jù),也可以向其中寫入數(shù)據(jù),,而
寫操作立即反應(yīng)在屏幕上,。為運行Qt/Embedded,嵌入式Linux內(nèi)核要支持framebuffer,。
Qt/Embedded是Qt的面向嵌入式應(yīng)用的簡化版本,,它包括一組完備的GUI類、操作系統(tǒng)封裝,、數(shù)據(jù)結(jié)構(gòu)類,、功能類和組合類。大部分Qt的應(yīng)用程序可以經(jīng)過簡單的編譯與重設(shè)窗口大小移植到Qt/Embedded,。
Qtopia是基于QT/Embedded開發(fā)的一個嵌入式的窗口系統(tǒng)和應(yīng)用程序集,,如地址本、圖像瀏覽,、Media播放器等,,還包括娛樂和配置工具,廣泛用于PDA等掌上設(shè)備,。
Qtopia平臺由Qtopia 庫(Qt/E,libqpe,libqtopia1,qtopiapim)和Qtopia
server/laucher組成,。Qtopia server/laucher是控制窗口系統(tǒng)、進程間通信,、發(fā)起所有應(yīng)用和其他核心任務(wù)的主要服務(wù)程序,。
(2) Qt/Embedded和Qtopia的交叉編譯與運行
整個GUI系統(tǒng)的構(gòu)建需要對Qt/Embedded、Qtopia依次分別編鏈,,然后有機地整合在一起,。Qt/Embedded為Qtopia提供了底層支持,,GUI系統(tǒng)的圖形庫窗口組建都由Qt/Embedded實現(xiàn)。
在構(gòu)建GUI時用于Qt開發(fā)的典型工具如下:
l
tmake:跨平臺的Makefile生成器,。
l
moc:用于Qt C++擴展的metra-object編譯器。
l
uic:從XML文件生成代碼的用戶界面編譯器,。
l
designer:用于設(shè)計窗口組建的應(yīng)用程序,。
Qtopia的開發(fā)工具包SDK(Software Development Kit)是Qtopia開發(fā)環(huán)境的核心部分,編譯后得到創(chuàng)建應(yīng)用程序所需的軟件包如下:
l
qvfb(virtual frame buffer):X窗口用來運行和測試Qtopia應(yīng)用程序的系統(tǒng)程序,。
l
qpe(Qtopia executable):用來處理所有的用戶程序界面[2,5],。
由于我們使用的是ARM CPU,因此需要對Qt/Embedded和Qtopia開發(fā)工具包進行交叉編譯,。本文使用arm-linux-gcc-3.3.2來建立交叉編譯環(huán)境,。為了對Qt/Embedded和Qtopia進行交叉編譯,需要使用如下的源碼樹:
l
tmake-1.13.tar.gz:用來得到tmake工具,。
l
qt-embedded-2.3.7.tar.gz:Qt的嵌入式版本,。
l
qt-x11-2.3.2.tar.gz:Qt的X11版本。
l
qtopia-free-1.7.0.tar.gz:官方網(wǎng)站提供的Qtopia免費版,。
l
e2fsprogs-1.38.tar.gz:為了得到qtopia所需的uuid.h和libuuid.so,。
假設(shè)將上述源碼樹放在同一目錄下,例如:/root/qtopia,,并依次解壓,,然后進行編譯,步驟如下:
①設(shè)定tmake的環(huán)境變量如下:
export
TMAKEPATH=/root/qtopia/tmake-1.13/lib/qws/linux-arm-g++
此處指定了tmake在生成Makefile時使用arm交叉編譯,。
②編譯qt-x11,,其目的是生成moc、uic,、qvfb,、designer,并將它們放在qt-embedded\bin目錄下,。
③配置qt-embedded編譯選項,,命令為:
./configure -platform linux-arm-g++ -qconfig qpe -qvfb -depths 4,8,16,32.
此處-platform
linux-arm-g++表示在arm平臺上進行交叉編譯;-qconfig local表示使用src/tools/qconfig-local.h,;-depths 4,8,16,32表示需要qt支持的顯示顏色深度,。
④使用make命令編譯qt-embedded,用來生成Qt庫(libqte.so),。
⑤配置并交叉編譯Qtopia,,生成應(yīng)用程序以及桌面環(huán)境。
假設(shè)編譯完成后將qt和qtopia相關(guān)的庫及所需文件分別存放于目標(biāo)板文件系統(tǒng)的/opt/qt和/opt/qtopia下,,運行Qtopia的方法是:
①設(shè)置QTDIR,、QPEDIR和鍵盤鼠標(biāo)等環(huán)境變量
export QTDIR=/opt/qt
export QPEDIR=/opt/qtopia
export
QWS_KEYBOARD=USB:/dev/input/event1
export
QWS_MOUSE_PROTO=USB:/dev/input/mouse0
②開啟qpe,,也就是在Linux圖形模式下執(zhí)行/opt/qtopia/bin/qpe &
這樣就可以在顯示終端上看到qtopia桌面環(huán)境了。
4
Qt/Embedded和Qtopia下應(yīng)用程序的實現(xiàn)
(1) Qt/Embedded應(yīng)用程序的實現(xiàn)
Qt是一個創(chuàng)建GUI程序的C++類庫,,編寫Qt應(yīng)用程序的主要工作是基于已有的Qt類編寫用戶類,。Qt應(yīng)用程序的設(shè)計使用基于工程的方法,并通
過.pro文件進行工程管理,。實現(xiàn)應(yīng)用程序的第一步是編寫.pro文件,,然后使用tmake根據(jù)該文件生成Makefile,最后進行源代碼的編寫,。
tmake的語法如下:
tmake *.pro –o Makefile
.pro的具體內(nèi)容可以參考/qt/examples/下其他應(yīng)用程序的.pro文件,。
在本項目的研究中,需要涉及基本的窗口構(gòu)建,、應(yīng)用程序的調(diào)用,、圖像背景的顯示以及中文顯示,下面對此進行詳細(xì)闡述,。
構(gòu)建主窗口
Qt擁有眾多的窗口部件,,如按鈕、菜單,、滾動條和應(yīng)用程序窗口等,,它們組合起來可以創(chuàng)建各種用戶界面。QWidget 是所有用戶界面對象的基類,,窗口部件是QWidget或其子類的實例,。
創(chuàng)建主窗口先要在main.cpp函數(shù)中創(chuàng)建QApplication類型的對象。QApplication類管理圖形用戶界面應(yīng)用程序的控制流和主要設(shè)
置,,它包含主事件循環(huán),,在其中來自窗口系統(tǒng)和其它資源的所有事件被處理和調(diào)度,它也處理應(yīng)用程序的初始化和結(jié)束,,并提供對話管理,。對于任何一個使用Qt圖
形用戶界面應(yīng)用程序,都正好存在一個QApplication對象,。然后定義主窗口變量,,并通過QApplication類型的函數(shù)調(diào)用主窗口變量來啟動
主窗口。
創(chuàng)建主窗口部件最常用的方法是基于QWidget或QDialog類創(chuàng)建一個用戶類,。QDialog類是對話框窗口的基類,,主要用于短期任務(wù)以及和用戶進行簡要通訊的頂級窗口。在本程序中使用QWidget類創(chuàng)建用戶類,,并使用戶類通過公有繼承派生于Qwidget類,。
在構(gòu)建窗口時需要注意用戶界面的風(fēng)格和布局。Qt提供了Windows,、WindowsXP,、Motif,、MotifPlus、CDE,、
Platinum,、SGI和Mac的內(nèi)置風(fēng)格。自定義風(fēng)格可以通過繼承QStyle,、QCommonStyle或其他QCommenStyle類來完成,。
應(yīng)用程序的風(fēng)格可以如下設(shè)置:
QApplication::setStyle(new MyCustomStyle)
在布局上Qt提供了布局管理器來組織父部件區(qū)域中的子部件,Qt內(nèi)建的布局管理器有QHBoxLayout,,QVBoxLayout和
QGridLayout,而且布局也可以嵌套在任意層,。例如使用QHBoxLayout(按行放置部件)的部件管理器為例在窗口水平放置兩個按鈕B1和
B2的代碼如下:
QHBoxLayout *hbox = new QHBoxLayout(this);
Hbox->addWidget(B1);
Hbox->addWidget(B2);
創(chuàng)建按鈕實現(xiàn)對應(yīng)用程序的調(diào)用
Qt部件與用戶的交互方式不同于其他的GUI工具包,,其他的GUI工具包使用回調(diào)函數(shù)創(chuàng)建用戶交互,但是Qt提供了信號/槽(signal/slots)
[5]通信機制描述對象間的無縫通訊,。槽(slot)是標(biāo)準(zhǔn)的成員函數(shù),,它能夠連接到信號,每當(dāng)槽所連接的信號被發(fā)射時,,槽(函數(shù))就被執(zhí)行,。信號
(signal)是一種特殊類型的函數(shù),都是返回void型,它們被定義為當(dāng)某個事件發(fā)生時就被發(fā)射,,之后執(zhí)行所有被連接的槽,。當(dāng)定義信號時必須使用QT
的宏SIGNAL(),定義槽時必須使用宏SLOT(),。
通過調(diào)用QObject對象的connect函數(shù)可以將某個對象的信號與另一個對象的槽相關(guān)聯(lián),,這樣當(dāng)發(fā)射對象發(fā)射信號時,接收對象的槽將被調(diào)用,。該函數(shù)定義如下:
bool QObject::connect(const QObject
*sender,const char *signal,const QObject *receiver,
const char *member)
與這個函數(shù)對應(yīng)的disconnect函數(shù),,可以將信號和槽斷開連接。
本文使用了QT庫提供的按鈕clicked()信號,,自定義了槽函數(shù)run()來實現(xiàn)對應(yīng)用程序的調(diào)用,,并且定義了槽函數(shù)mycall()調(diào)用已經(jīng)使用了特定參數(shù)的run()函數(shù)。
例如當(dāng)一個按鈕B1被點擊時,,它就發(fā)送“clicked”信號,,通過connect()函數(shù)將信號與槽“mycall”連接起來,調(diào)用/opt/qt/examples/clock/下的應(yīng)用程序“clock”的代碼如下:
void
MyMainWindow::mycall()
{
MyMainWindow::run(“(cd
/opt/qt/examples/clock; exec ./clock;)”);
}
connect(B1,SIGNAL(clicked()),this,SLOT(mycall()));
圖像背景的顯示
為了在Qt中裝載和顯示所支持的圖像格式,,需要創(chuàng)建一個QPixmap對象,。QPixmap本質(zhì)上是一個“屏幕外的部件(off-screen)”,圖像可以先復(fù)制到一個QPixmap對象上,,然后傳送到QWidget,。
QWidget部件使用如下的成員函數(shù)來為窗口添加圖像背景:
Public Members
const QPixmap*
[url=../../../%E5%BE%81%E6%96%87/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BE%81%E6%96%87/html/qwidget.html#9b2957#9b2957]backgroundPixmap[/url]
() const
virtual void
[url=../../../%E5%BE%81%E6%96%87/%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%BE%81%E6%96%87/html/qwidget.html#7e417f#7e417f]setBackgroundPixmap[/url]
( const QPixmap & )
例如有一幅名為flower.png的圖片,將其設(shè)為背景的代碼如下:
QPixmap picture(“flower.png”)
SetbackgroundPixmap(picture)
中文顯示
Qt的中文顯示是Qt國際化的一部分,,“國際化”簡稱為i18n,用來提供一個架構(gòu),,讓同樣的代碼可以適用于各種語種習(xí)慣和編碼系統(tǒng),,程序設(shè)計人員只要利用這個架構(gòu)的機制、準(zhǔn)則編寫應(yīng)用程序,,就可以在不新編譯代碼的情況下,,支持各種語言。
Qt支持Unicode—國際標(biāo)準(zhǔn)字符集,,程序員可以在程序里自由的混用英語,、漢語和其他Unicode所支持的語言。為Qt增加一種編碼只需要增加該編碼和Unicode的轉(zhuǎn)化編碼就可以了,,Qt支持中文的GBK/Big5編碼,。
Qt支持的字體常用的是ttf和qpf。qpf是Qt/Embedded專用的一種適合嵌入式應(yīng)用的字體,,它屬于位圖字體,,不可以縮放,而ttf字體可以
縮放,。默認(rèn)情況下Qt/Embedded在lib/fonts目錄下提供了一種可以顯示中文的字體庫UniFont,,但是該字體庫中沒有ttf的字體。為
了使用ttf字體顯示中文,,本文采取如下的方法:拷貝一種支持unicode編碼的ttf字體到lib/fonts目錄下,,例如,windows系統(tǒng)下的
宋體simsun.ttf,;同時還需要在此目錄的fontdir腳本中添加下面一行:
simsun simsun.ttf FT n 50 0 su
fontdir腳本用來向系統(tǒng)注冊所支持的字體,,它的每一行定義了一種字體的設(shè)置,其格式如下:
字體名稱>字體文件名>字體渲染類型>是否斜體>尺寸>字體標(biāo)志>[尺寸列表]
在程序設(shè)計中,,首先指定編碼方式以支持中文:
QTextCodec *code=QTextCodec::codecForName("GBK")
接著為部件(例如Mywidget)執(zhí)行 Unicode的轉(zhuǎn)化編碼:
QString
uniStr=code -> toUnicode("要顯示的中文字符")
Mywidget->
setFont(QFont("simsun",20,QFont::Bold))
Mywidget->
setText(uniStr)
(2) 向Qtopia移植應(yīng)用程序
Qtopia是一個基于QT/Embedded開發(fā)的一個嵌入式的桌面環(huán)境和應(yīng)用程序集,,可以方便地在Qtopia桌面環(huán)境中添加用戶應(yīng)用程序或者對桌面
進行配置。為了添加用戶應(yīng)用程序,,需要在Qtopia/apps/Application目錄下建立一個.desktop的桌面文件,,該文件指明了桌面文
件的圖標(biāo)以及應(yīng)用程序的入口點。應(yīng)該注意的是為了讓新的應(yīng)用程序在Qtopia桌面環(huán)境中運行,,應(yīng)用程序必須使用QT提供的圖形庫進行編譯,。
下面以移植嵌入式的web瀏覽器konqueror為例,說明添加新的應(yīng)用程序的過程,。
(1)下載konqueror源代碼,,對其進行交叉編譯。為了支持中文顯示和flash,,還需要進行必要的源代碼修改,,并且加入相應(yīng)的插件,。
(2)將konqueror.png圖標(biāo)文件拷貝到在/opt/Qtopia/pic/下。
(3)將konqueror可執(zhí)行文件放于/opt/konqueror/下,,然后在Qtopia/apps/Application目錄下建立
konqueror.desktop文件,,具體內(nèi)容可參考qtopia自帶的.desktop文件。需要注意的是konqueror.desktop的
Exec項應(yīng)指明可執(zhí)行文件的具體位置,。例如:Exec=/opt/konqueror/bin/konqueror
(4)導(dǎo)出konqueror的運行環(huán)境變量,,就可以直接在桌面上點擊其圖標(biāo)瀏覽網(wǎng)頁了。
5
結(jié)束語
嵌入式產(chǎn)品的廣泛應(yīng)用帶動了圖形用戶界面(GUI)的迅速發(fā)展,,嵌入式系統(tǒng)需要一個高性能,、高可靠的GUI的支持?;赒t/Embedded的
Qtopia桌面系統(tǒng)為系統(tǒng)用戶提供了良好的使用和交互環(huán)境,。本文系統(tǒng)介紹了基于Qt/Embedded開發(fā)應(yīng)用程序的方法以及將現(xiàn)有的應(yīng)用程序移植進
Qtopia的具體過程,為類似的系統(tǒng)開發(fā)供了一個參考,。
參考文獻(xiàn)
[1] 丁丁,習(xí)勇,,魏急波,,三種主流嵌入式圖形用戶界面的移植及性能比較,《電子產(chǎn)品世界》,,2004,9(5):73-74
[2]
QT 3.3白皮書,,
http://www.
[3] 袁鵬飛,24小時學(xué)通qt編程,,北京:人民郵電出版社,,2000/11
[4] 于明儉,陳向陽,,方漢,, LINUX程序設(shè)計權(quán)威指南,北京:機械工業(yè)出版社,,2001/4
[5] 張娟,,張雪蘭,基于嵌入式的GUI應(yīng)用程序的實現(xiàn),,《計算機應(yīng)用》,,2003,23(4):115-117
作者簡介:王麗潔(1981-),女,,碩士研究生,,研究方向為嵌入式系統(tǒng)的開發(fā)與應(yīng)用。
作者聯(lián)系方式:410073,,湖南長沙國防科大四院2系,,0731-4575752,,13873163041,
[email protected]
交叉編譯Qtopia的幾個問題
[url=#indexdir]Return to Top[/url]
[http://blog.csdn.net/chenrongqin/archive/2005/08/28/466936.aspx]
本文記載步驟和排錯過程,,用到的源碼包有:qt-embedded-2.3.10-free.tar.gz,、qtopia-free-source-2.1.1.tar.gz、jpegsrc.v6b.tar.gz,、e2fsprogs-1.38.tar.gz,。
步驟主要有:
1. 注意設(shè)置環(huán)境變量:QTEDIR、QPEDIR,、PATH,、LD_LIBRARY_PATH等
2. 交叉編譯qte:
./configure –qconfig qpe -system-jpeg -no-xft -gif -qvfb -depths 4,8,16,32 –xplatform linux-arm-g++
3. 交叉編譯qtopia
./configure -edition pda -no-qtopiadesktop -displaysize 480X640 –xplatform linux-arm-g++
在編譯過程中遇到的主要錯誤有:
1. usr/local/hybus-arm-linux-R1.1/arm-linux/bin/ld:
warning: libjpeg.so.62, needed by /usr/local/qt-2.3.10/lib/libqte.so,
not found (try using -rpath or -rpath-link)
/usr/local/qt-2.3.10/lib/libqte.so: undefined reference to `jpeg_read_scanlines'...........................
解決方法:
從http:///redir/libjpeg/5665/url_tgz/jpegsrc.v6b.tar.gz下載jpegsrc.v6b.tar.gz解壓并進入解壓的目錄。
tar -xzf jpegsrc.v6b.tar.gz
cd jpeg-6b
[root@localhost jpeg-6b]# ./configure --enable-shared
修改生成的Makefile文件:
prefix = qt-embeddedd的文件夾路徑(eg: /usr/local/qt-2.3.10)
CC= /usr/local/arm/2.95.3/bin/arm-linux-gcc
AR= /usr/local/arm/2.95.3/bin/arm-linux-ar rc
AR2= /usr/local/arm/2.95.3/bin/arm-linux-ranlib
保存
在你的qt-embedded中建立man/man1文件家,否則安裝jpeg庫時會出錯
[root@ localhost jpeg-6b]#mkdir -p qt-2.3.10/man/man1
最后:
[root@ localhost jpeg-6b]# make
[root@ localhost jpeg-6b]# make install
就可以給qt-embedded添加好for arm的libjpeg庫.
把生成的庫文件向下面的目錄中也拷貝一份:
/usr/local/hybus-arm-linux-R1.1/arm-linux/lib
/usr/lib
2. qpeapplication.cpp: In method `void QPEApplication::systemMessage(const QCString &, const QByteArray &)':
qpeapplication.cpp:2175: warning: unused variable `int old'...............
解決方法:在$QPEDIR/src/libraries/qtopia目錄下執(zhí)行
cp custom-linux-ipaq-g++.cpp custom-linux-myarm-g++.cpp
cp custom-linux-ipaq-g++.h custom-linux-myarm-g++.h
3. 遇到關(guān)于libuuid的錯誤時.................
解決辦法:交叉編譯e2fsprogs-1.38:
./configure –host=arm-linux –with-cc=arm-linux-gcc –with-linker=arm-linux-ld –enable-elf-shlibs –prefix=/usr/local/qtopia-2.1.1
make
make install
這樣就將libuuid庫安裝到了qtopia目錄下,。
再執(zhí)行cp –r /usr/local/e2fsprogs-1.38/lib/uuid /usr/local/qtopia-2.1.1/include
使得qtopia能夠找到頭文件,。
嵌入式工具QT的安裝與使用
[url=#indexdir]Return to Top[/url]
[http://blog.csdn.net/suisuibianbian/archive/2004/11/18/185923.aspx]
Qt是Trolltech公司的一個產(chǎn)品。Trolltech是挪威的一家軟件公司,,主要開發(fā)兩種產(chǎn)品:一種是跨平臺應(yīng)用程序界面框架,;另外一種就是提供
給做嵌入式Linux開發(fā)的應(yīng)用程序平臺,能夠應(yīng)用到PDA和各種移動設(shè)備上,。Qt和Qtopia分別是其中具有代表性的兩個,。
Qt是一個多平臺的C++圖形用戶界面應(yīng)用程序框架,它能給用戶提供精美的圖形用戶界面所需要的所有元素,,而且它是基于一種面向?qū)ο蟮乃枷?,所以用戶對其對象的擴展是相當(dāng)容易的,并且它還支持真正的組件編程,。
Qt是Linux桌面環(huán)境KDE的基礎(chǔ),。筆者認(rèn)為,可以說Qt與Windows下的Mfc的實質(zhì)是一樣的,,所以Qt最大的優(yōu)點在于其跨平臺性,,可以支持現(xiàn)有的多種操作系統(tǒng)平臺,主要有:
◆ MS/Windows 95,、Windows 98,、WindowsNT 4.0、Windows 2000,、Windows XP,;
◆ Unix/X11 Linux、Sun Solaris,、HP-UX,、Compaq True64Unix、IBM AIX、SGI IRIX和很多其它X11平臺,;
◆ Macintoshi Mac OSX,;
◆ Embedded—帶FramBuffer的Linux平臺。
下面簡單介紹一下Qt/Embedded和Qtopia在Linux上的安裝和使用,,還有在開發(fā)過程中可能碰到的一些問題,。
Qt 和Qtopia的安裝
如果需要安裝一個帶FramBuffer的Qtopia平臺,需要有以下軟件(所列舉軟件以筆者使用的為例):
◆ Qtopia 1.6.0,;
◆ Tmake 1.11,;
◆ Qt/Embedded 2.3.4(Qtopia 1.6.0是基于該開發(fā)平臺上開發(fā)的);
◆ Qt/Embedded 2.3.2 for X11,;
◆ Qt 3.1.2 for X11,。
在Trolltech公司的網(wǎng)站上可以下載該公司所提供的Qt/Embedded的免費版本。
Qtopia平臺安裝分為以下幾個步驟:
1. 解包Qtopia
在Linux命令模式下運行以下命令:
tar xfz qtopia-source-1.6.0 (解包)
cd qtopia-source-1.6.0
export QPEDIR=$PWD (設(shè)置環(huán)境變量)
cd..
2. 安裝Tmake
在Linux命令模式下運行以下命令:
tar xfz tmake-1.11.tar.gz
export TMAKEDIR=$PWD/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/bin:$PATH
3. 安裝Qt/Embedded2.3.4
在Linux命令模式下運行以下命令:
tar xfz qt-embedded-2.3.4-commercial.tar.gz
cd qt-2.3.4
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
. /configure -qconfig qpe -qvfb -depths 4,8,16,32
make sub-src
cd ..
也可以在configure的參數(shù)中添加-system-jpeg和gif,,使Qtopia平臺能支持jpeg,、gif格式的圖形。
4. 安裝Qt/X11 2.3.2
在Linux命令模式下運行以下命令:
tar xfz qt-x11-2.3.2-commercial.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
. /configure -no-opengl
make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..
根據(jù)開發(fā)者本身的開發(fā)環(huán)境,,也可以在configure的參數(shù)中添加別的參數(shù),,比如-no-opengl或-no-xfs,可以鍵入./configure -help來獲得一些幫助信息,。
5. 安裝Qt/X11 3.1.2
在Linux命令模式下運行以下命令:
tar xfz qt-x11-commercial-3.1.x.tar.gz
cd qt-x11-commercial-3.1.x
export QTDIR=$PWD
export QT3DIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -thread
make
cd ..
6. 安裝Qtopia
在Linux命令模式下運行以下命令:
cd qtopia-source-1.6.x
export QTDIR=$QTEDIR
export QPEDIR=$PWD
export PATH=$QPEDIR/bin:$PATH
cd src
./configure
make
cd ../..
7. 安裝Qtopia桌面
cd qtopia-source-1.6.x/src
export QTDIR=$QT3DIR
./configure -qtopiadesktop
make
mv qtopiadesktop/bin/qtopiadesktop ../bin
cd ..
Qt和Qt Designer的使用
根據(jù)上面的步驟安裝完成了Qt/Embedded和Qtopia之后,,就可以運行這些程序了。
運行Qt的虛擬仿真窗口:在Linux的圖形模式下運行命令qvfb&,;Qtopia只是一個用Qt/Embedded開發(fā)的程序,運行Qtopia,,在圖形模式下運行命令:
export QTDIR=$QTEDIR,
qpe &,;
這樣Qtopia的程序就運行在QVFB上,即Qt的虛擬仿真窗口,。
Qt/Embedded是針對嵌入式Linux而開發(fā)的一種開發(fā)工具,,Qt封裝了一些常用的類,而且這些類的名字都以Q字開頭命名,,如QString,、QDialog等。這里主要介紹一下如何利用Qt Designer來設(shè)計組件,,并生成相應(yīng)的代碼,。
在Qt中,把組件分為復(fù)合體,、原始體和配件,。而在Qt中,組件是由一些抽象類、復(fù)雜的組件類,、管理組件幾何特性的類等組成,。
Qt中有三個主要的基類:QObject、Qapplication和QWidget,。
在Qt
中編程,,利用Signal和Slot進行對象之間的通信是Qt的主要特征。它與Windows中的消息機制非常類似,,但是Signal和Slot機制真正
實現(xiàn)了一種消息的封裝,。當(dāng)對象的狀態(tài)改變時,發(fā)出Signal,,通知所有的Slot接受Signal,,盡管它不知道哪些函數(shù)是Slot,Slot一開始也
不知道哪些Signal可以接收,。Signal和Slot之間不是一一對應(yīng)的關(guān)系,,一個Signal可以發(fā)給多個Slot,
Slot也可以接收多個Signal,。Slot除了可以接收Signal以外,,與其它的成員函數(shù)沒有區(qū)別。這種機制比使用回調(diào)函數(shù)要靈活,,但是會減慢程序
的運行速度,。不過在現(xiàn)在高速CPU的面前,這種損失是無足輕重的,,而且它還能保證程序的簡明性和靈活性,,非常便利。
在Qt的組件中,,不僅定義了常用的成員變量和成員函數(shù),,還定義了所有與該組件相關(guān)的Signal和Slot。
要將組件組合起來,,最簡單的方法就是使用Qt Designer,。首先要啟動Qt Designer,在Linux命令模式下,,鍵入以下命令(假設(shè)Qt安裝在/usr/local下):
cd qt-2.3.2/bin
./designer
這樣就可以啟動一個與Windows下的Delphi相類似的如圖1的界面,。
然
后新建一個QFrame,將自己需要的組件直接拖拉到這個Frame中,,相信很多人都有過這樣的經(jīng)歷,,此處就不再詳細(xì)描述了。完成之后存盤時,,會將這個新
的組件保存為一個擴展名為.ui的文件,。假設(shè)所存的文件名為test.ui,,用vi
test.ui來查看這個文件,發(fā)現(xiàn)這是一個用xml語言寫的一個文本,。下面用這個test.ui生成相應(yīng)的test.h和test.cpp,。同樣還是在
這個目錄下,可以看到一個uic的工具,,這個是Qt專門用來將ui文件生成.h和.cpp文件的,,在終端模式下鍵入以下命令:
./uic -o test.h test.ui
./uic -o test.h -i test.cpp test.ui
此
時就能看到生成了相應(yīng)test.h和test.cpp,這是一個類,。當(dāng)然這只是一些表面的東西,,還需要在這些代碼中添加相應(yīng)的Signal和Slot,完
成所需要的操作,。值得注意的是,,相應(yīng)版本生成的ui最好用相應(yīng)版本的uic來生成代碼。如果用Qt 3.1.2的Designer生成的ui,,用Qt
2.3.2的uic來生成代碼,,生成的代碼都會是一些空函數(shù)。
在一般的開發(fā)過程中,,首先通過這個ui生成的一個類,,在Qt中通常叫做
Base,如上面的例子,,叫做testBase,;然后再新建一個類,來繼承這個Base,。通常叫做實現(xiàn)類Impl,,如testImpl。在這個實現(xiàn)類里面
定義所需要的成員函數(shù),、Signal和Slot,,因為ui可能是經(jīng)常需要改動的。如果這樣做,,每次只需要在Designer中修改ui,而不用去理會這些
成員函數(shù),、Signal和Slot了,。
編譯一個Qt程序必然需要Makefile,在Qt中提供了一個專門生成Makefile的工具,,就是tmake,。用tmake需要根據(jù)編寫的程序?qū)懸粋€.pro文件。.pro文件非常簡單,,有固定的格式,,下面是一個例子:
TEMPLATE = app
CONFIG = qtopia warn_on release
MOC_DIR =tmp
OBJECTS_DIR =tmp
HEADERS =fcrs.h\
structs.h \
globalfunc.h \
globalvars.h \
testimpl.h
SOURCES = main.cpp \
globalfunc.cpp\
globalvars.cpp \
testimpl.cpp
INTERFACES = test.ui \
TARGET = fcrs
生成這個.pro文件之后,在終端中鍵入下面的命令:
tmake -o Makefile test.pro
就自動生成了一個Makefile,使用這個Makefile編譯所編寫的程序就可以了,。
Signals and Slots in Depth
[url=#indexdir]Return to Top[/url]
[http://blog.csdn.net/suisuibianbian/archive/2004/11/18/185923.aspx]
信號和槽機制是Qt編程的基礎(chǔ),。它使應(yīng)用程序員能夠在對象之間互相不知道任何聯(lián)系的情況下把這些對象幫定在一起。我們已經(jīng)連接了一些信號和槽,,聲明了我們自己的信號和槽,,執(zhí)行自己的槽,發(fā)出自己的信號,。讓我們花點時間深入點看這個機制,。
槽與普通的C++成員函數(shù)幾乎一樣。它們可以是virtual,overloaded,public,protected,private,并且可以被其他C++成語函數(shù)直接調(diào)用,。區(qū)別是槽可以被信號連接,,信號被發(fā)送將它自動調(diào)用。
connect()聲明如下:
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
sender和receiver是指向QObjects的指針,,signal和slot是沒有參數(shù)名的函數(shù)signatures(簽名),。SIGNAL()和SLOT()宏將轉(zhuǎn)換它們的參數(shù)成為一個字符串。
剛才的例子中我們總是連接不同的信號到不同槽,,有更多的可能去探究:
1 . 一個信號可以連接很多槽:
connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(updateStatusBarIndicator(int)));
當(dāng)信號發(fā)出,,這些槽一個接一個被調(diào)用,以任意順序,。
2 . 很多信號可以連接到同樣的槽:
connect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()),this, SLOT(handleMathError()));
其中任何一個信號發(fā)出時,,這個槽被調(diào)用。
3. 一個信號可以連接到另一個信號:
connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SIGNAL(updateRecord(const QString &)));
當(dāng)?shù)谝粋€信號發(fā)出,第二個信號也會發(fā)出.從這點,singnal-singnal連接與signal-slot連接不能區(qū)分.
4 . 連接可以被移除:
disconnect(lcd, SIGNAL(overflow()),this, SLOT(handleMathError()));
這個很少需要,因為Qt在對象刪除的時候自動刪除所有包括對象的連接.
當(dāng)連接一個信號到一個槽(或者連接到另一個信號),它們都必須用同樣的順序有同樣的參數(shù):
connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),this, SLOT(processReply(int, const QString &)));
異常情況,如果信號比它連接的槽更多的參數(shù),增加的參數(shù)將直接忽略:
connect(ftp, SIGNAL(rawCommandReply(int, const QString &)),this, SLOT(checkErrorCode(int)));
如果參數(shù)類型不符合,或者信號或槽不存在,Qt將輸出一個運行時警告.同樣,如果參數(shù)名被包含在信號或槽signatures(簽名)里,Qt將給一個警告.
QT中的信號和槽
[url=#indexdir]Return to Top[/url]
[http://blog.csdn.net/compiler_hdz/archive/2006/02/13/598163.aspx]
在圖形界面編程中,,很多時候我們希望一個可視對象發(fā)生某種變化時通知另一個或幾個對象,,再一個地說,我們希望任何一
類的對象能和其他對象進行通訊,。例如,,某個數(shù)值顯示窗口負(fù)責(zé)顯示某個滾動條對象的當(dāng)前數(shù)值,當(dāng)滾動條對象的值發(fā)生變化時,,我們希望數(shù)值顯示窗口能收到來自
滾動條對象發(fā)送的“數(shù)值改變”的信號,,從而改變自己的顯示數(shù)值。
對于類似以上的問題,,較早的工具包使用“回調(diào)”的方式來實現(xiàn),。回調(diào)是指一個函數(shù)的指針,,如果你希望一個處理函數(shù)同志你一些事件,,你可以把另一個函數(shù)的指針傳遞給處理函數(shù)。處理函數(shù)在適當(dāng)?shù)臅r候會調(diào)用回調(diào)函數(shù),。
采用回調(diào)方式實現(xiàn)對象間的通訊有兩個主要缺點,,首先回調(diào)函數(shù)不是類型安全的,,我們不能確定處理函數(shù)使用了正確的參數(shù)來調(diào)用回調(diào)函數(shù),第二,,回調(diào)函數(shù)和處理函數(shù)間的聯(lián)系非常緊密,,因為處理函數(shù)必須知道要調(diào)用哪個回調(diào)函數(shù)。
在QT開發(fā)環(huán)境中,,實現(xiàn)對象間的通訊我們有一種稱為“信號和槽”的機制可以代替回調(diào)函數(shù),。信號和槽機制用于實現(xiàn)對象間的通訊,是QT的一個中心特性,,恐怕也是QT與其它工具包最不同的地方了,。
信號和槽機制就是:當(dāng)一個特定的事件發(fā)生時,一個或幾個被指定的信號就被發(fā)射,,槽就是一個返回值為void的函數(shù),,如果存在一個或幾個槽和該信號相連接,那在該信號被發(fā)射后,,這個(些)槽(函數(shù))就會立刻被執(zhí)行,。
信
號和槽機制是類型安全的,一個信號的簽名必須與它的接收槽的簽名相匹配,,這樣編譯器就可以幫助我們檢查類型是否匹配,。信號和槽是很寬松的聯(lián)系在一起的,一
個發(fā)射信號的對象不用考慮哪個槽會接收這個信號,,接收信號的槽的所在對象也不知道要連接的信號是哪個對象發(fā)射的,。QT的信號和槽機制可以保證如果你把一個
信號和一個槽連接起來后,槽會在正確的時間使用信號的參數(shù)而被調(diào)用,,信號和槽可以使用任何數(shù)量,、類型的參數(shù)。
QT的窗口部件已經(jīng)有很多預(yù)定
義的信號,,也有很多預(yù)定義的槽,,但我們總是通過繼承來加入我們自己的信號和自己的槽,這樣我們就可以處理感興趣的信號了,。凡是從QObject類或者它的
某個子類繼承的所有類都可以包含信號和槽,。當(dāng)某個事件發(fā)生后,被指定的信號就會被發(fā)射,,它不知道也沒有必要知道是否有槽連接了該信號,,這就是信息封裝。
槽
是可以用來接收信號的正常的對象的成員函數(shù),,一個槽不知道它是否被其它信號連接,??梢园岩粋€信號和一個槽進行單獨連接,,這時槽會因為該信號被發(fā)射而被執(zhí)
行,;也可以把幾個信號連接在同一個槽上,這樣任何一個信號被發(fā)射都會使得該槽被執(zhí)行,;也可以把一個信號和多個槽連接在一起,,這樣該信號一旦被發(fā)射,與之相
連接的槽都會被馬上執(zhí)行,,但執(zhí)行的順序不確定,,也不可以指定;也可以把一個信號和另一個信號進行連接,,這樣,,只要第一個信號被發(fā)射,第二個信號立刻就被發(fā)
射,。
下面看看不使用信號和槽和使用信號和槽的兩個對象有什么不同,。
不使用信號和槽的C++對象:
class NoSignalClass {
public:
NoSignalClass (void) {}
int value (void) const {return _value;}
int setValue (int value) {_value = value;}
private:
int _value;
}
使用信號和槽的QT對象:
class UseSignalClass {
Q_OBJECT
public:
UseSignalClass (void) {}
int value (void) const {return _value;}
public slots:
int setValue (int value) {_value = value;}
signals:
void valueChanged (int);
private:
int _value;
}
這
兩個類有相同的內(nèi)部狀態(tài),相同的公有方法,,但后一個類卻支持使用信號和槽的組件編程:這個類可以通過發(fā)射一個信號(valueChanged())來告訴
外界它的狀態(tài)發(fā)生了變化,,并且它有一個槽,可以接收信號,。所有包含信號和槽的類都必須在它們的聲明中提到Q_OBJECT,。槽要由自己來實現(xiàn),這里最好把
int setValue (int value)槽這樣實現(xiàn):
void UseSignalClass::setValue( int value )
{
if ( value != _value ) {
_val = value;
emit valueChanged(value);
}
}
emit valueChanged(value);這行代碼是發(fā)射一個信號valueChanged,。
要想使一個槽在一個信號被發(fā)射后被執(zhí)行,,要顯示地進行連接:
UseSignalClass a,b;
connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
這樣做后,就把對象a的信號valueChanged和對象b的槽setValue連接了起來,,當(dāng)a的信號valueChanged被發(fā)射后,,對象b的槽setValue馬上就被執(zhí)行。
執(zhí)行以下這句代碼:
b.setValue( 10 );
這句被執(zhí)行后,,對象b的valueChanged信號會被發(fā)射,,但沒有槽和該信號相連,所以什么也沒做,,信號被丟棄,。
a.setValue( 80);
這句被執(zhí)行后,對象a的valueChanged信號會被發(fā)射,,該信號有槽(對象b的setValue)相連,,所以b.setValue(int)馬上被執(zhí)行,且參數(shù)為80,,所以b.value()的值為80,。
如果要解除已經(jīng)建立好連接的信號和槽,可以使用disconnect()函數(shù),。bool QObject::disconnect ( const QObject * sender, const char * signal,
const Object * receiver, const char * member ) [static]
這個函數(shù)斷開發(fā)射者中的信號和接收者中的槽函數(shù)之間的關(guān)聯(lián),。有以下三種情況:
1,、斷開某個對象與其它對象的任何連接:
disconnect(object, 0, 0, 0);或object->disconnect();
2、斷開某個信號與其它任何槽的連接:
disconnect(object, SIGNAL(signal()), 0, 0);或object->disconnect(SIGNAL(signal()));
3,、斷開兩個對象之間的任何關(guān)聯(lián):
disconnect(object, 0, receiver, 0);或object->disconnect(receiver);
在disconnect函數(shù)中0可以用作一個通配符,,可分別表示任何信號、任何接收對象,、接收對象中的任何槽函數(shù),。但是發(fā)射者不能為0,其它三個參數(shù)都可以為0,。
關(guān)
鍵字signals指出隨后開始信號的聲明,,這里signals用的是復(fù)數(shù)形式而非單數(shù),siganls沒有public,、private,、
protected等屬性,這點不同于slots,。另外,,signals、slots關(guān)鍵字是QT自己定義的,,不是C++中的關(guān)鍵字,。
這個例子說明,采用QT的信號和槽機制后,,對象之間可以在相互不知道的情況下一起工作,,只要在最初的時候在他們中間建立了連接。
槽也是普通的C++函數(shù),,可以一樣被調(diào)用,,他唯一的特點就是 他們可以被信號連接。因為槽就是普通的成員函數(shù),,它們也和普通的成員函數(shù)一樣有訪問權(quán)限,,一個槽的訪問權(quán)限決定了哪些信號可以和它相連接,而信號就沒有訪問權(quán)限的概念,。
一個public slots:區(qū)包含了任何信號都可以相連的槽,。你生成了許多對象,它們互相并不知道,,把它們的信號和槽連接起來,,這樣信息就可以正確地傳遞,并且就像一個鐵路模型,,把它打開然后讓它跑起來,。
一個protected slots:區(qū)包含了之后這個類和它的子類的信號才能連接的槽。這就是說這些槽只是類的實現(xiàn)的一部分,而不是它和外界的接口,。
一個private slots:區(qū)包含了之后這個類本身的信號可以連接的槽,。這就是說它和這個類是非常緊密的,甚至它的子類都沒有獲得連接權(quán)利這樣的信任,。
也可以把槽定義為虛函數(shù),這也很有用,。
使用信號和槽機制,,要注意以下問題:
1、信號和槽的機制是非常有效的,,但是它不像“真正的”回調(diào)那樣快,。信號和槽稍微有些慢,這是因為它們所提供的靈活性,。但這種損失相對來說是比較小的,。但要追求高效率的話,比如在實時系統(tǒng)中就要盡量少用這種機制,。
2,、信號和槽機制與普通函數(shù)的調(diào)用一樣,如果使用不當(dāng)?shù)脑?,在程序?zhí)行時有可能形成死循環(huán),,所以,在定義槽函數(shù)時一定要注意避免間接形成無限循環(huán),,即在槽中再次發(fā)射所接收到的同樣的信號,。
3、如果一個信號和多個槽相關(guān)聯(lián)的話,,那當(dāng)這個信號被發(fā)射時,,與之相關(guān)聯(lián)的槽的執(zhí)行順序?qū)⑹撬铏C的,且順序不能指定,。
4,、宏定義不能用在signal和slot的參數(shù)中。
5,、構(gòu)造函數(shù)不能用在signals和slots聲明區(qū)域內(nèi),。
6、函數(shù)指針不能作為信號或槽的參數(shù),。
7,、信號和槽不能有缺省參數(shù)值。
8,、信號和槽不能攜帶模板類參數(shù),。
9、嵌套的類不能位于信號和槽區(qū)域內(nèi),,也不能有信號或者槽,。
10,、友元聲明不能位于信號和槽的聲明區(qū)域內(nèi)。
本文來自ChinaUnix博客,,如果查看原文請點:http://blog./u/23458/showart_179424.html
|
|