青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-22  文章-0  trackbacks-0
一、Qt/Embedded 開發環境的安裝
一般來說,居于Qt/Embedded開發的應用程序最終會發布到安裝有嵌入式Linux操作系統的小型設備上,所以使用裝有Linux操作系統的PC機或者工作站來完成Qt/Embedded開發當然是最理想的環境,盡管Qt/Embedded也可以安裝在Unix和Windows系統上。下面我們將介紹如何在一臺裝有Linux操作系統的機器上建立Qt/Embedded開發環境。首先,您需要擁有三個軟件安裝包:tmake工具安裝包, Qt/Embedded 安裝包,Qt的X11版的安裝包。
由于上述這些軟件安裝包有許多不同的版本,您要注意由于版本的不同導致這些軟件在使用時可能造成的沖突,為此我們將告訴您一些基本的安裝原則:當您選擇或下載了 Qt/Embedded 的某個版本的安裝包之后,您下一步要選擇安裝的Qt for X11的安裝包的版本必須比您最先下載的Qt/Embedded 的版本要舊,這是因為Qt for X11的安裝包的兩個工具uic和designer產生的源文件會和Qt/Embedded的庫一起被編譯鏈接,本著“向前兼容”的原則, Qt for X11的版本應比Qt/Embedded的版本舊。
我們將以下面所列版本的安裝包,一步一步介紹Qt/Embedded開發環境建立的過程(這
些軟件可以免費從trolltech的WEB或FTP服務器上下載):
◆ tmake 1.11 或更高版本;(生成Qt/Embedded應用工程的Makefile文件)
◆ Qt/Embedded 2.3.7;(Qt/Embedded 安裝包)
◆ Qt 2.3.2 for X11; (Qt的X11版的安裝包, 它將產生x11開發環境所需要的兩個工具)
1、安裝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
2. 安裝Qt/Embedded 2.3.7
在Linux 命令模式下運行以下命令:
tar xfz qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -qconfig -qvfb -depths 4,8,16,32
make sub-src
cd ..
上述命令 ./configure -qconfig -qvfb -depths 4,8,16,32 指定Qt 嵌入式開發包生成虛擬緩沖幀工具qvfb,并支持4,8,16,32 位的顯示顏色深度。另外我們也可以在configure 的參數中添加-system-jpeg 和gif,使Qt/Embedded 平臺能支持jpeg、gif格式的圖形。上述命令 make sub-src 指定按精簡方式編譯開發包,也就是說有些Qt 類未被編譯。Qt 嵌入式開發包有5 種編譯范圍的選項,使用這些選項,可控制Qt 生成的庫文件的大小,但是您的應用所使用到的一些Qt 類將可能因此在Qt 的庫中找不到鏈接。編譯選項的具體用法可運行./configure -help 命令查看。
3. 安裝Qt/X11 2.3.2
在Linux 命令模式下運行以下命令:
tar xfz qt-x11-2.3.2.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 ..
根據開發者本身的開發環境,也可以在configure 的參數中添加別的參數,比如-no-opengl 或-no-xfs,可以鍵入./configure -help 來獲得一些幫助信息。

二、認識Qt/Embedded 開發環境
Qt/Embedded 的開發環境可以取代那些我們熟知的UNIX 和WINDOWS 開發工具。它提供了幾個跨平臺的工具使得開發變得迅速和方便,尤其是它的圖形設計器。Unix 下的開發者可以在PC 機或者工作站使用虛擬緩沖幀,從而可以仿真一個和嵌入式設備的顯示終端大小,象素相同的顯示環境。嵌入式設備的應用可以在安裝了一個跨平臺開發工具鏈的不同的平臺上編譯。最通常的做法是在一個UNIX系統上安裝跨平臺的帶有libc庫的GNU c++編譯器和二進制工具。在開發的許多階段,一個可替代的做法是使用Qt的桌面版本,例如Qt/X11或是Qt/Windows來進行開發。這樣開發人員就可以使用他們熟悉的開發環境,例如微軟的Visual C++ 或者 Borland C++;在UNIX操作系統下,許多環境也是可用的,例如Kdevelop,它也支持交互式開發。如果Qt/Embedded 的應用是在UNIX 平臺下開發的話,那么它就可以在開發的機器上以一個獨立的控制臺或者虛擬緩沖幀的方式來運行,對于后者來說,其實是有一個X11的應用程序虛擬了一個緩沖幀。通過指定顯示設備的寬度,高度和顏色深度,虛擬出來的緩沖幀將和物理的顯示設備在每個像素上保持一致。這樣每次調試應用時開發人員就不用總是刷新嵌入式設備的FLASH 存儲空間,從而加速了應用的編譯、鏈接和運行周期。運行Qt 的虛擬緩沖幀工具的方法是:在Linux 的圖形模式下運行命令:
qvfb (回車)
當Qt 嵌入式的應用程序要把顯示結果輸出到虛擬緩沖幀時,我們在命令行運行這個程序時,在程序名后加上-qws 的選項。例如: $> hello -qws

2.1 QT 的支撐工具
Qt 包含了許多支持嵌入式系統開發的工具,其中一些工具我們會在別的地方介紹。有兩個最實用的工具(除了上面我們提到的虛擬緩沖幀)是 qmake 和Qt designer(圖形設計器)。qmake 是一個為編譯Qt/Embedded 庫和應用而提供的Makefile 生成器。它能夠根據一個工程文件(.pro)產生不同平臺下的Makefile 文件。qmake 支持跨平臺開發和影子生成(shadow builds),影子生成是指當工程的源代碼共享給網絡上的多臺機器時,每臺機器編譯鏈接這個工程的代碼將在不同的子路徑下完成,這樣就不會覆蓋別人的編譯鏈接生成的文件。qmake 還易于在不同的配置之間切換。開發者可以使用Qt 圖形設計器可視化地設計對話框而不需編寫一行代碼。使用Qt圖形設計器的布局管理可以生成具有平滑改變尺寸的對話框,qmake 和Qt 圖形設計器是完全集成在一起的。

2.2 信號與插槽
信號與插槽機制提供了對象間的通信機制,它易于理解和使用,并完全被Qt 圖形設計器所支持。圖形用戶接口的應用需要對用戶的動作做出響應。例如,當用戶點擊了一個菜單項或是工具欄的按鈕時,應用程序會執行某些代碼。大部分情況下,我們希望不同類型的對象之間能夠進行通信。程序員必須把事件和相關代碼聯系起來,這樣才能對事件做出響應。以前的工具開發包使用的事件響應機制是易崩潰的,不夠健壯的,同時也不是面向對象的。Trolltech 已經創立了一種新的機制,叫做“信號與插槽”。信號與插槽是一種強有力的對象間通信機制,它完全可以取代原始的回調和消息映射機制;信號與插槽是迅速的,類型安全的,健壯的,完全面向對象并用C++來實現的一種機制。
在以前,當我們使用回調函數機制來把某段響應代碼和一個按鈕的動作相關聯時,我們通常把那段響應代碼寫成一個函數,然后把這個函數的地址指針傳給按鈕,當那個按鈕被按下時,這個函數就會被執行。對于這種方式,以前的開發包不能夠確保回調函數被執行時所傳遞進來的函數參數就是正確的類型,因此容易造成進程崩潰,另外一個問題是,回調這種方式緊緊的綁定了圖形用戶接口的功能元素,因而很難把開發進行獨立的分類。Qt的信號與插槽機制是不同的。Qt的窗口在事件發生后會激發信號。例如一個按鈕被點擊時會激發一個“clicked”信號。程序員通過建立一個函數(稱作一個插槽),對象1圖一一些信號與插槽連接的抽象圖然后調用connect()函數把這個插槽和一個信號連接起來,這樣就完成了一個事件和響應代碼的連接。信號與插槽機制并不要求類之間互相知道細節,這樣就可以相對容易的開發出代碼可高重用的類。信號與插槽機制是類型安全的,它以警告的方式報告類型錯誤,而不會使系統產生崩潰。
例如,如果一個退出按鈕的clicked() 信號被連接到了一個應用的退出函數-
信號1
信號2
插槽1
插槽2
插槽1
插槽2
插槽3
插槽1
信號1
信號1
對象3
對象4
connect( 對象1, 信號1, 對象2, 插槽1 )
connect( 對象1, 信號1, 對象2, 插槽2 )
connect( 對象1, 信號2, 對象4, 插槽1 )
connect( 對象3, 信號1, 對象4, 插槽3 )
對象2
quit() 插槽。那么一個用戶點擊退出鍵將使應用程序終止運行。上述的連接過程用代碼寫出來就是這樣connect( button, SIGNAL(clicked()), qApp, SLOT(quit()) );我們可以在Qt應用程序的執行過程中增加或是減少信號與插槽的連接。信號與插槽的實現擴展了C++的語法,同時也完全利用了C++面向對象的特征。信號與插槽可以被重載或者重新實現,它們可以定義為類的公有,私有或是保護成員。

2.2.1 信號與插槽的例子
如果一個類要使用信號與插槽機制,它就必須是從QObject或者QObject的子類繼承,而且在類的定義中必須加上Q_OBJECT宏。信號被定義在類的信號部分,而插槽則定義在public slots, protected slots 或者 private slots 部分。
下面定義一個使用到信號與插槽機制的類。
class BankAccount : public QObject
{
Q_OBJECT
public:
BankAccount() { curBalance = 0; }
int balance() const { return curBalance; }
public slots:
void setBalance( int newBalance );
signals:
void balanceChanged( int newBalance );
private:
int curBalance;
};
和大部分的C++的類一樣,BankAccount類有一個構造函數,還有一個取值的函數balance(),一個設置值的函數setBalance( int newBalance )。這個類有一個信號balanceChanged(),這個信號聲明了它在BankAccount類的成員curBalance的值被改變時產生。信號不需要被實現,當信號被激發時,和該信號連接的插槽將被執行。上面用來設置值的函數setBalance( int newBalance )定義在類的“public slots”部分,因此它是一個插槽。插槽是一個需要實現的標準的成員函數,它可以像其它函數一樣被調用,也可以和信號相連接。
下面就是該插槽函數setBalance( int newBalance )的實現代碼:
void BankAccount::setBalance( int newBalance )
{
if ( newBalance != curBalance )
{
curBalance = newBalance;
emit balanceChanged( curBalance );
}
}
其中的一段代碼
emit balanceChanged( curBalance );
它的作用是當curBalance 的值被改變后,將新的curBalance 的值作為參數去激活balanceChanged()信號。對于關鍵詞“emit”,它和信號、插槽一樣是由Qt 提供的,這些關鍵詞都會被c++的預處理機制轉換為c++代碼。一個對象的信號可以被多個不同的插槽連接,而多個信號也可以被連接到相同的插槽。當信號和插槽被連接起來時,應當確保它們的參數類型是相同的,如果插槽的參數個數小于和它連接在一起的信號的參數個數,那么從信號傳遞插槽的多余的參數將被忽略。

2.2.2 元對象編譯器
信號與插槽機制是以純C++代碼來實現的,實現的過程使用到了Qt 開發工具包提供的預處理器和元對象編譯器(moc)。moc 讀取應用程序的頭文件,并產生支持信號與插槽的必要的代碼。開發者沒必要編輯或是瀏覽這些自動產生的代碼,當有需要時,qmake 生成的Makefile 文件里會顯式的包含了運行moc 的規則。除了可以處理信號與插槽機制之外,moc 還支持翻譯機制,屬性系統和運行時的信息。

2.3 窗體
Qt 擁有豐富的滿足不同需求的窗體(按鈕,滾動條等等),Qt 的窗體使用起來很靈活,為了滿足特別的要求,它很容易就可以被子類化。窗體是Qwidget類或它子類的實例,客戶自己的窗體類需要從Qwidget它的子類繼承。
圖二 摘錄的Qwidget 類的繼承圖
一個窗體可以包含任意數量的子窗體,子窗體可以顯示在父窗體的客戶區,一個沒父窗體的窗體我們稱之為頂級窗體(一個“窗口”),一個窗體通常有一個邊框和標題欄作為裝飾。Qt 并未對一個窗體有什么限制,任何類型的窗體可以是頂級窗體,任何類型的窗體可以是別的窗體的子窗體。在父窗體顯示區域的子窗體的位置可以通過布局管理自動的進行設置,也可以人為的指定。當父窗體無效,隱藏或被刪除后,它的子窗體都會進行同樣的動作。標簽,消息框,工具欄等等等,并未被限制使用什么顏色,字體和語言。Qt的文本呈現窗體可以使用HTML子集顯示一個多語言的寬文本。

2.3.1 一個Hello 的例子
下面是一個顯示“Hello Qt/Embedded!”的程序的完整的源代碼:
圖三 Hello Qt/Embedded
#i nclude <qapplication.h>
#i nclude <qlabel.h>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QLabel *hello = new QLabel( "<font color=blue>Hello"
" <i>Qt/Embedded!</i></font>", 0 );
app.setMainWidget( hello );
hello->show();
return app.exec();
}

2.3.2 通用窗體
下面是一些主要的Qt 窗體的截屏圖,這些窗體使用了窗口樣式。
圖四 使用了QHBox 進行排列一個標簽和一個按鈕
圖五 使用了QbuttonGroup的兩個單選框和兩個復選框
圖六 使用了QgroupBox進行排列的的日期類QDateTimeEdit, 一個行編輯框類QLineEdit, 一個文本編輯類QTextEdit 和一個組合框類QComboBox
圖七 以QGrid排列的一個 QDial, 一個QProgressBar, 一個QSpinBox, 一個QScrollBar, 一個QLCDNumber和一個QSlider
圖八 以QGrid排列的一個QIconView, 一個 QListView, 一個 QListBox 和一個 QTable有些時候在進行字符輸入時,我們希望輸入的字符滿足了某種規則才能使輸入被確認。Qt提供了解決的辦法,例如QComboBox, QLineEdit 和 QspinBox 的字符輸入可以通過Qvalidator的子類來進行約束和有效性檢查。通過繼承QScrollView ,QTable, QListView, QTextEdit 和其它窗體就能夠顯示大量的數據,并且自動的擁有了一個滾動條。許多Qt創建的窗體能夠顯示圖像,例如按鈕,標簽,菜單項等等。Qimage類支持幾種圖形格式的輸入、輸出和操作,它目前支持的圖形格式有BMP, GIF*, JPEG, MNG, PNG, PNM, XBM和 XPM。

2.3.3 畫布
QCanvas 類提供了一個高級的平面圖形編程接口,它可以處理大量的像線條、矩形、橢圓、文本、位圖、動畫等這些畫布項,畫布項可以較容易的做成交互式的(例如做成支持用戶移動的)。畫布項是QcanvasItem子類的實例,它們比窗體類Qwidget更顯得輕量級,它們能夠被快速的移動,隱藏和顯示。 Qcanvas可以更有效的支持沖突檢測,它能夠列出一個指定區域里面的所有的畫布項。QcanvasItem可以被子類化,從而可以提供更多的客戶畫布項類型,或者擴展已有的畫布項的功能。Qcanvas對象是由QcanvasView進行繪制的,QcanvasView對象可以以不同的譯文、比例、旋轉角度,剪切方式去顯示同一個畫布。Qcanvas 對象是理想的數據表現方式,它已經被消費者用于繪制地圖和顯示網絡拓撲結構。它也可用于制作快節奏的且有大量角色的平面游戲。圖九 在Qtopia 中用QCanvas 實現的小行星游戲

2.3.4 客戶窗體
通過對Qwidget或者它的子類進行子類化,我們可以建立自己的客戶窗體或者對話框。下面是一個完整的源代碼例子,它示例了如何通過子類化窗體,繪制一個模擬的時鐘。AnalogClock 窗體類是Qwidget的子類,它顯示當前時間,并且可以自動地更新時間。
圖十 模擬鐘窗體
在 analogclock.h頭文件中, AnalogClock 以這樣地形式定義::
#i nclude <qwidget.h>
class AnalogClock : public QWidget
{
public:
AnalogClock( QWidget *parent = 0, const char *name = 0 );
protected:
virtual void timerEvent( QTimerEvent *event );
virtual void paintEvent( QPaintEvent *event );
};
AnalogClock 類繼承了Qwidget, 它有一個典型的窗體類構造函數,這個函數有父窗口對象指針和名字指針兩個參數。(如果設置了名字的話,測試和調試起來就會容易些) timerEvent() 函數是從QObject (Qwidget的父類)對象繼承而來的,這個函數會被系統定期調用。paintEvent() 函數是從QWidget 繼承而來的并且當窗體需要重畫時這個函數就會被調用。timerEvent() 和 paintEvent() 函數是“事件句柄”的兩個例子。應用對象以重載父類對象的虛擬函數events (QEvent objects) 的形式接收系統的事件。大約有超過50個的系統事件是較常用的,例如 MouseButtonPress, MouseButtonRelease, KeyPress, KeyRelease, Paint, Resize 和Close. 對象可以對發給它們的事件做出響應或者篩選一些事件后再發送給別的對象。analogclock.cpp 文件是定義在analogclock.h中的函數的實現源文件
#i nclude <qdatetime.h>
#i nclude <qpainter.h>
#i nclude "analogclock.h"
AnalogClock::AnalogClock( QWidget *parent, const char *name )
: QWidget( parent, name )
{
startTimer( 12000 );
resize( 100, 100 );
}
void AnalogClock::timerEvent( QTimerEvent * )
{
update();
}
void AnalogClock::paintEvent( QPaintEvent * )
{
QCOORD hourHand[8] = { 2, 0, 0, 2, -2, 0, 0, -25 };
QCOORD minuteHand[8] = { 1, 0, 0, 1, -1, 0, 0, -40 };
QTime time = QTime::currentTime();
QPainter painter( this );
painter.setWindow( -50, -50, 100, 100 );
painter.setBrush( black );
for ( int i = 0; i < 12; i++ )
{
painter.drawLine( 44, 0, 46, 0 );
painter.rotate( 30 );
}
painter.save();
painter.rotate( 30 * (time.hour() % 12) + time.minute() / 2 );
painter.drawConvexPolygon( QPointArray(4, hourHand) );
painter.restore();
painter.save();
painter.rotate( 6 * time.minute() );
painter.drawConvexPolygon( QPointArray(4, minuteHand) );
painter.restore();
}
構造函數設置窗口的尺寸大小為100 x 100,并且告訴系統每隔12秒調用一次timerEvent()函數,從而對模擬鐘的窗體進行刷新。在 timerEvent()函數中, 通過調用QWidget的函數 update()就可以告訴Qt,窗體需要立即重畫,緊接著Qt就會產生一個繪制事件并且調用paintEvent()函數。在paintEvent() 函數中,一個Qpainter對象用于在窗體上繪制12個刻度以及分針,時針。Qpainter類提供了一種統一的方式用于繪制窗體,位圖,矢量圖等,它提供了繪制點,線,橢圓,多邊形,弧,貝塞爾曲線等功能,一個Qpainter的坐標系可以被轉變,縮放,旋轉,和剪切,這樣對象就可以根據它在窗口或者窗體上的位置繪制出一個剪切的視圖。剪切可以使窗體繪制時減少閃爍。使用QPainter 的子類QdirectPainter可以鎖定和直接訪問幀緩沖區域。
文件 analogclock.h 和 analogclock.cpp 完全的定義和實現了AnalogClock 客戶窗體類,這個窗體是現在就可以使用的。
#i nclude <qapplication.h>
#i nclude "analogclock.h"
int main( int argc, char **argv )
{
QApplication app( argc, argv );
AnalogClock *clock = new AnalogClock;
app.setMainWidget( clock );
clock->show();
return app.exec();
}

2.3.5 主窗口
QMainWindow 類是為應用的主窗口提供一個擺放相關窗體的框架。一個主窗口包含了一組標準窗體的集合。主窗口的頂部包含一個菜單欄,它的下方放置著一個工具欄,工具欄可以移動到其它的停靠區域。主窗口允許停靠的位置有頂部,左邊,右邊和底部。工具欄可以被拖放到一個停靠的位置,從而形成一個浮動的工具面板。主窗口的下方,也就是在底部的停靠位置之下有一個狀態欄。主窗口的中間區域可以包含其它的窗體。提示工具和“這是什么”幫助按鈕以旁述的方式闡述了用戶接口的使用方法。對于小屏幕的設備,使用Qt圖形設計器定義的標準的Qwidget模板比使用主窗口類更好一些。典型的模板包含有菜單欄,工具欄,可能沒有狀態欄(在必要的情況下,可以用任務欄,標題欄來顯示狀態)

2.3.6 菜單
彈出式菜單QpopupMenu類以垂直列表的方式顯示菜單項,它可以是單個的(例如上下文相關菜單),可以以菜單欄的方式出現,或者是別的彈出式菜單的子菜單出現。每個菜單項可以有一個圖標,一個復選框和一個加速器(快捷鍵),菜單項通常對應一個動作(例如存盤),分隔器通常顯示成一條豎線,它用于把一組相關聯的動作菜單分立成組。
下面是一個建立包含有New,Open 和Exit 菜單項的文件菜單的例子。
QPopupMenu *fileMenu = new QPopupMenu( this );
fileMenu->insertItem( "&New", this, SLOT(newFile()), CTRL+Key_N );
fileMenu->insertItem( "&Open...", this, SLOT(open()), CTRL+Key_O );
fileMenu->insertSeparator();
fileMenu->insertItem( "E&xit", qApp, SLOT(quit()), CTRL+Key_Q );
當一個菜單項被選中,和它相關的插槽將被執行。加速器(快捷鍵)很少在一個沒有鍵盤輸入的設備上使用,Qt/Embedded 的典型配置并未包含對加速器的支持。上面出現的代碼 “&New”意思是在桌面機器上以“New”的方式顯示出來,但是在嵌入式設備上,它只會顯示為“New”。 QmenuBar類實現了一個菜單欄,它會自動的設置幾何尺寸并在它的父窗體的頂部顯示出來,如果父窗體的寬度不夠寬以致不能顯示一個完整的菜單欄,那么菜單欄將會分為多行顯示出來。Qt內置的布局管理能夠自動的調整菜單欄。Qt的菜單系統是非常靈活的,菜單項可以被動態的使能,失效,添加或者刪除。通過子類化QcustomMenuItem,我們可以建立客戶化外觀和功能的菜單項。

2.3.7 工具欄
QtoolButton 類實現了一個帶有圖標,3維邊框和可選標簽的工具欄按鈕。切換工具欄按鈕具有開、關的特征,其它的按鈕則執行一個命令。不同的圖標用來表示按鈕的活動,無效、使能模式,或者是開或關的狀態。如果你僅為按鈕指定了一個圖標,那么Qt會使用可視提示來表現按鈕不同的狀態,例如按鈕失效時顯示灰色。工具欄按鈕通常以一排的形式顯示在工具欄上,對于一個有幾組工具欄的應用,用戶可以隨便的到處移動這些工具欄,工具欄差不多可以包含所有的窗體,例如 QComboBoxes 和 QspinBoxes。

2.3.8 旁述
現代的應用主要使用旁述的方式去解釋用戶接口的用法。Qt 提供了兩種旁述的方式: “提示欄”和“這是什么”幫助按鈕。 “提示欄”是小的,通常是黃色的矩形,當鼠標在窗體的一些位置游動時它就會自動出現。它主要用于解釋工具欄按鈕,特別是那些缺少文字標簽說明的工具欄按鈕的用途。下面就是如何設置一個“存盤”按鈕的提示的代碼。
QToolTip::add( saveButton, "Save" );
當提示字符出現之后,你還可以在狀態欄顯示更詳細的文字說明。對于一些沒有鼠標的設備(例如那些使用觸點輸入的設備),就不會有鼠標的光標在窗體上進行游動,這樣就不能激活提示欄。對于這些設備也許就需要使用“這是什么”幫助按鈕,或者使用一種姿態來表示輸入設備正在進行游動,例如用按下或者握住的姿態來表示現在正在進行游動。 “這是什么”幫助按鈕和提示欄有些相似,只不過前者是要用戶點擊它才會顯示旁述。在小屏幕設備上,要想點擊“這是什么”幫助按鈕,具體的方法是,在靠近應用的X 窗口的關閉按鈕“x”附近你會看到一個“?”符號的小按鈕,這個按鈕就是“這是什么”幫助按鈕。一般來說,“這是什么”幫助按鈕按下后要顯示的提示信息應該比提示欄要多一些。下面是設置一個存盤按鈕的“這是什么”文本提示信息的方法:
QWhatsThis::add( saveButton, "Saves the current file." );
QToolTip 和 QWhatsThis 類提供了虛擬函數以供開發者重新實現更多的特定的用途。Qtopia并未使用上述提及的兩種幫助(旁述)機制。它在應用窗口的標題欄上放置一個“?”符號的按鈕來代替上述的旁述機制,這個“?”按鈕可以啟動一個瀏覽器來顯示和當前應用相關的HTML頁面。Qtopia使用按下和握住的姿態來調用上下文菜單(右擊)和屬性對話框。

2.3.9 動作
應用程序通常提供給用戶幾種不同的方式去執行特別的動作。例如,大部分應用提供了一個“Save”動作給用于存盤的菜單(File|Save)以及工具欄(一個“軟盤”圖標的工具欄按鈕)和快捷鍵(Ctrl+S)。Qaction類可以讓上述過程變得簡潔,它允許程序員在一個地方定義一個動作,然后把這個動作加入到菜單或者工具欄,這個過程與把菜單項加入到菜單的道理是一樣的。
下面的代碼實現了一個“Save”菜單項和一個“Save”工具按鈕,旁述系統和快捷鍵可
以很容易的添加進去,但是我們沒添加,因為它們很少在嵌入式設備上使用。
QAction *saveAct = new QAction( this );
saveAct->setText( "Save" );
saveAct->setIconSet( QPixmap("save.png") );
connect( saveAct, SIGNAL(activated()), this, SLOT(save()) );
saveAct->addTo( fileMenu );
saveAct->addTo( toolbar );
除了不用復制代碼,使用Qaction 還可以確保菜單的狀態與工具欄按鈕的狀態保持一致,必要的時候還可顯示提示欄。使一個動作(Action)失效將導致和該動作相關聯的菜單項以及工具按鈕的失效。同樣的,如果用戶切換一個工具按鈕的狀態,那么相關的菜單項的也會跟著被選中或不選中。

2.4 對話框
使用Qt 圖形設計器這個可視化設計工具用戶可以建立自己的對話框。Qt 使用布局管理自動的設置窗體與別的窗體之間相對的尺寸和位置,這樣可以確保對話框能夠最好的利用屏幕上的可用空間。使用布局管理意味著按鈕和標簽可以根據要顯示的文字自動的改變自身大小,而用戶完全不用考慮文字是那一種語言。

2. 4. 1 布局
Qt 的布局管理用于組織管理一個父窗體區域內的子窗體。它的特點是可以自動的設置子窗體的位置和大小,并可判斷出一個頂級窗體的最小和缺省的尺寸,當窗體的字體或內容變化后,它可以重置一個窗體的布局。使用布局管理,開發者可以編寫獨立于屏幕大小和方向之外的程序,從而不需要浪費代碼空間和重復編寫代碼。對于一些國際化的應用程序,使用布局管理,可以確保按鈕和標簽在不同的語言環境下有足夠的空間顯示文本,不會造成部分文字被剪掉。布局管理使得提供部分用戶接口組件,例如輸入法和任務欄變得更容易。我們可以通過一個例子說明這一點,當Qtopia的用戶正在輸入文字時,輸入法會占用一定的文字空間,應用程序這時也會根據可用的屏幕尺寸的變化調整自己。
圖十 Qtopia 的布局管理
Qt提供了三種用于布局管理的類:QHBoxLayout, QVBoxLayout 和 QgridLayout。
圖十一 QHBoxLayout, QVBoxLayout 和 QGridLayout 的布局效果
QHBoxLayout 布局管理把窗體按照水平方向從左至右排成一行
QVBoxLayout 布局管理把窗體按照垂直方向從上至下排成一列
QGridLayout 布局管理以網格的方式來排列窗體,一個窗體可以占據多個網格。
在多數情況下,布局管理在管理窗體時執行最優化的尺寸,這樣窗口看起來就更好看而且可以尺寸變化會更平滑。使用以下的機制可以簡化窗口布局的過程:
1、 為一些子窗口設置一個最小的尺寸,一個最大的或者固定的尺寸。
2、 增加拉伸項(stretch items)或者間隔項 (spacer item)。拉伸項和間隔項可以填充一個排列的空間。
3、 改變子窗口的尺寸策略,程序員可以調整窗體尺寸改變時的一些策略。子窗體可以被設置為擴展,緊縮和保持相同尺寸等策略。
4、 改變子窗口的尺寸提示。QWidget::sizeHint() 和 QWidget::minimumSize-Hint() 函數返回一個窗體根據自身內容計算出的首選尺寸和首選最小尺寸,我們在建立窗體時可考慮重新實現這兩個函數。
5、設置拉伸比例系數。設置拉伸比例系數是指允許開發者設置窗體之間占據空間大小的比例系數,例如我們設定可用空間的2/3 分配給窗體A,剩下的1/3 則分配給窗體B。布局管理也可按照從右至左,從下到上的方式來進行。當一些國際化的應用需要支持從右至左閱讀習慣的語言文字(例如阿拉伯和希伯來)時,使用從右至左的布局排列是更方便的。布局是可以嵌套的和隨意進行的。下面是一個對話框的例子,它以兩種不同尺寸大小來顯示:
圖十二 小的對話框和大的對話框
這個對話框使用了三種排列方式。QVBoxLayout管理一組按鈕,QHBoxLayout管理一個顯示國家名稱的列表框和右邊那組按鈕, QVBoxLayout管理窗體上剩下的組件“Now pleaseselect a country”標簽。在“< Prev”和“Help”按鈕之間放置了一個拉伸項(stretch items),使得兩者之間保持了一定比例的間隔。
建立這個對話框窗體和布局管理的實現代碼如下:
QVBoxLayout *buttonBox = new QVBoxLayout( 6 );
buttonBox->addWidget( new QPushButton("Next >", this) );
buttonBox->addWidget( new QPushButton("< Prev", this) );
buttonBox->addStretch( 1 );
buttonBox->addWidget( new QPushButton("Help", this) );
QListBox *countryList = new QListBox( this );
countryList->insertItem( "Canada" );
/* … */
countryList->insertItem( "United States of America" );
QHBoxLayout *middleBox = new QHBoxLayout( 11 );
middleBox->addWidget( countryList );
middleBox->addLayout( buttonBox );
QVBoxLayout *topLevelBox = new QVBoxLayout( this, 6, 11 );
topLevelBox->addWidget( new QLabel("Now please select a country", this) );
topLevelBox->addLayout( middleBox );
使用Qt 圖形設計器設計的這個對話框,顯示如下
圖十三 Qt 圖形設計器中使用了布局的對話框

2. 4. 2 Qt 圖形設計器
Qt 圖形設計器是一個具有可視化用戶接口的設計工具。Qt 的應用程序可以完全用源代碼來編寫,或者使用Qt 圖形設計器來加速開發工作。啟動Qt 圖形設計器的方法是:
在Linux 命令模式下,鍵入以下命令(假設Qt X11 安裝在/usr/local 下):
cd qt-2.3.2/bin
./designer
這樣就可以啟動一個與Windows 下的Delphi 相類似界面。 下圖是使用Qt 圖形設計器設計一個表單的截屏圖。
圖十四 Qt 圖形設計器
開發者點擊工具欄上的代表不同功能的子窗體/組件的按鈕,然后把它放到一個表單上面,這樣就可以把一個子窗體/組件放到表單上了。開發者可以使用屬性對話框來設置子窗體的屬性。精確的設置子窗體的位置和尺寸大小是沒必要的。開發者可以選擇一組窗體,然后對他們進行排列。例如,我們選定了一些按鈕窗體,然后使用“水平排列(lay out horizontally)”選項對它們進行一個接一個的水平排列。這樣做使得設計工作變得更快,而且完成后的窗體將能夠按照屬性設置的比例填充窗口的可用尺寸范圍。使用Qt 圖形設計器進行圖形用戶接口的設計可以消除應用的編譯,鏈接和運行時間,同時使得修改圖形用戶接口的設計變得更容易。Qt 圖形設計器的預覽功能可以使開發者能夠在開發階段看到各種樣式的圖形用戶界面,包括客戶樣式的用戶界面。通過Qt集成的功能強大的數據庫類,Qt 圖形設計器還可提供生動的數據庫數據瀏覽和編輯操作。
開發者可以建立同時包含有對話框和主窗口的應用,其中主窗口可以放置菜單,工具欄,旁述幫助等等的子窗口部件。Qt 圖形設計器提供了幾種表單模板,如果窗體會被多個不同的應用反復使用,那么開發者也可建立自己的表單模板,以確保窗體的一致性。Qt 圖形設計器使用向導來幫助人們更快更方便的建立包含有工具欄、菜單和數據庫等方面的應用。程序員可以建立自己的客戶窗體,并把它集成到Qt 圖形設計器中。Qt 圖形設計器設計的圖形界面以擴展名“ui”的文件進行保存,這個文件有良好的可讀性,這個文件可被uic(Qt 提供的用戶接口編譯工具)編譯成為C++的頭文件和源文件。Qmake 工具在它為工程生成的Makefile 文件中自動的包含了uic 生成頭文件和源文件的規則。另一種可選的做法是,在應用程序運行期間載入ui 文件,然后把它轉變為具備原先全部功能的表單。這樣開發者就可以在程序運行期間動態修改應用的界面,而不需重新編譯應用,另一方面,也使得應用的文件尺寸減小了。

2. 4. 3 建立對話框
Qt 為許多通用的任務提供了現成的包含了實用的靜態函數的對話框類,下邊是一些Qt 的標準的對話框的截屏圖。QmessageBox類是一個用于向用戶提供信息或是給用戶進行一些簡單選擇(例如 “yes”或“no”)的對話框類。
圖十五 一個QMessageBox 對話框
progressDialog對話框包含了一個進度欄和一個“Cancel”按鈕圖十六 一個QprogressDialog 對話框Qwizard類提供了一個向導對話框的框架
圖十七 一個向導類
Qt提供的對話框還包括QColorDialog, QFileDialog, QFontDialog 和QprintDialog。這些類通常適用于桌面應用,一般不會在Qt/Embedded中編譯使用它們。

2.5 外形與感覺
Qt 桌面應用隨著執行環境(例如Windows XP, Mac OS X, Linux)的不同而具有不同的樣式,或者叫做外形與感覺。Qt/Embedded 的應用可以使用不同操作環境提供的樣式,也可以以靜態或插件的方式使用客戶樣式。開發者可以設計自己窗體的樣式和窗口裝飾。

2.5.1 窗體樣式
一個樣式是一個實現Qt窗體外形與視覺效果的類Qstyle的子類。Qt/Embedded 程序員可以自由的使用和修改目前存在的樣式,也可以使用Qt樣式設計引擎實現自己的樣式。目前Qt/Embedded提供的樣式類型有 EmbeddedareWindows, Motif, MotifPlus,CDE, Platinum 和 SGI。樣式可以被動態的設置到一個應用中,甚至可以設置到特定的窗體上。
圖十八 以不同樣式建立的下拉框
通過給一組相關的應用編寫一個客戶樣式,可以讓這些應用的外觀具有與眾不同的感覺。建立客戶樣式可以通過子類化QStyle,QcommonStyle或者 QcommonStyle的派生類來實現。通過重新實現現有樣式基類的一兩個虛函數可以很容易對現有樣式做一些小的修改。一個樣式可以編譯成為一個插件,在Qt 圖形設計器中,把樣式做成插件的話,開發者就可以以設備的客戶樣式來預覽設計出來的表單。樣式插件使得開發者不需重新編譯就可改變設備的外觀。
圖十九 Qstyle 的繼承圖
Qt 發布的窗體都是樣式已知的,當它們的樣式改變后,窗體會自動重繪。客戶窗體和對話框大多數都是Qt原先發布的窗體和布局的重新整合。它們也是自動的獲得原先的樣式。在少數場合,當有必要寫一個外觀上很隨意的窗體時,開發者可以使用QStyle去寫一些用戶接口元素,而不是直接的繪制固有的矩形。

2.5.2 窗口裝飾
頂級窗口的裝飾是由一個標題欄和一個框架組成的。Qt/Embedded 包括了這些窗口樣式:BeOS, Hydro, KDE 和 Windows。
圖二十 不同的平臺上的窗口風格
如果需要的話,我們可以配置不同的窗口使用不同的窗口裝飾。通過子類化QWSDecoration,我們可以建立客戶的裝飾樣式,并且把它們以插件的形式進行發布。為了在窗口管理器之外進行更多的控制行為,開發者需要子類化QWSManager。

2.6 國際化
Qt/Embedded 完全支持Unicode,一個國際標準的字符集。開發者在他們的應用中可以自由的混合使用被Unicode字符集支持的語言,例如阿拉伯文,英文,中文,希伯來文,日文和俄文等。為了有助于公司將產品推向國際市場,Qt還提供了將應用翻譯成支持多種語言環境的工具。

2.6.1 Unicode
Qt 使用QString 存儲Unicode 編碼的字符串,Qstring 取代了粗糙的const char *;它提供了用于處理Qstring 和const char *之間相互轉換的構造函數和操作符。因為Qt 使用了隱式共享(寫時復制)技術來減少內存的使用,所以直接復制Qstring 的值是不會產生問題的。為有效率的存儲ASII 碼字符串,Qt 還提供了QCString 類。Qt 為所有要顯示在屏幕上的文本,包括最簡單的文字標簽到最復雜的寬文本編輯器,提供了一個強大的Unicode 文本呈現引擎。這個引擎支持一些先進的特征,例如特殊的間隔線、雙向寫和區別標記。它幾乎支持世界上所有的書寫系統,包括阿拉伯文,中文,古斯拉夫文,英文,希臘文,希伯來文,日文,韓文,拉丁和越南文。體現這個引擎的最優化性能的常用的例子就是:在帶有加速功能的文字的下方顯示一條下劃線(例如 File)。QtextCodec 的子類用于處理不同編碼類型的字符集之間的轉換。Qt 3.0 支持37 種不同的編碼方式,包括中文的Big5 和GBK,日文的EUC-JP、JIS 和Shift-JIS,俄羅斯的KOI8-R和ISO 8859 系列。它們可以以庫的一部分或者插件的形式編譯,或者使用“feature”機制去除這些編譯。

2.6.2 應用的翻譯
Qt 提供了相應的工具和函數用于幫助開發者以他們的本地語言推出應用。要使一個字符串可以被翻譯,你需要把這個字符串作為一個參數放到tr()函數中調用。例如:
saveButton->setText( tr("Save") );
Qt 嘗試尋找字符串"Save"的譯文,如果找到的話,就會把它的譯文顯示出來,如果找不到,就用原來的字符串"Save"進行顯示。例如我們把英文作為源語言,現在我們要把這個源語言翻譯成中文,即中文為翻譯的目標語言,以此類推。這樣當我們調用tr()函數后,函數的參數的原先的缺省編碼就會轉變為 Unicode 編碼。Tr()函數的通常用法為:
Context::tr("source text", "comment")
上面的 “Context” 是指一個QObject 對象的子類的名稱。如果在一個包含了tr()成員函數的類的上下文環境中使用tr()函數時,“Context”通常可以省略掉。例如:
Context::func1()
{
setText( tr("Save") );
}
“source text”是指要翻譯的文本的內容 “comment”是一個可選項,它用于給手工翻譯者提供一些額外的信息。說了半天,還有一個重要的內容我們沒談,就是tr()函數如何尋找到譯文。我們要把一個源字符串翻譯為和它對應的譯文(目標語言的字符串)時,我們需要讓Qt 知道這些譯文放在哪里。Qt 規定了譯文存儲在QTranslator 對象中,這個對象是從一個內存映射文件(擴展名為pm)中讀取譯文。每個pm 文件包含了某種語言的譯文信息。所以開發者需要建立一個pm 文件來存儲應用中需要翻譯的字符串的譯文。Qt 提供了3 種工具幫助人們建立譯文存儲文件(.pm 文件),這3 個工具是lupdate, QtLinguist 和 lrelease.
1、lupdate 自動地從源代碼文件(.cpp)和界面接口文件(.ui)中獲取所有需要翻譯的對象,即上述的(“Context”);同時還獲取要翻譯的所有的字符串(源語言的字符串),即上述的“source text”;“comment”選項如果被使用的話,也會被納入收集的范圍。當這些信息收集完畢后,lupdate 最后會生成一個.ts 文件(翻譯源文件),這個文件是直接可閱讀的。
2、開發者使用Qt Linguist 工具提供的良好的人機界面打開一個.ts 文件(翻譯源文件),然后開發者根據每一個source text 填寫上相對應的譯文,這樣一個.ts 文件(翻譯源文件)就包含了完整的“Context”,“source text”和譯文信息。
3、最后通過運行lrelease 去把一個.ts 文件(翻譯源文件)壓縮為一個.pm 文件(譯文存儲文件),生成的.pm 文件可用在嵌入式設備上。
在一個應用的生存期間里,上述的步驟有可能根據需要會被反復執行。多次運行lupdate 是很安全的,你可以重復使用已經存在的譯文(.pm)文件,或者當你不想使用某些翻譯文件時你可以標記這些翻譯源文件為舊文件,而不需要刪除它們。

posted on 2009-07-17 14:06 Bluesea 閱讀(4616) 評論(0)  編輯 收藏 引用 所屬分類: 嵌入式開發
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩午夜精品视频| 亚洲另类一区二区| 久久久久久穴| 欧美中文在线字幕| 久久成人免费视频| 欧美资源在线观看| 久久久五月天| 麻豆av一区二区三区| 免费成人小视频| 欧美精品在线极品| 国产精品成人av性教育| 国产精品夜色7777狼人| 狠狠色丁香婷婷综合久久片| 国产亚洲午夜| 亚洲激情在线视频| 亚洲影院免费观看| 久久久久久久999精品视频| 狂野欧美一区| 日韩写真视频在线观看| 久久青草欧美一区二区三区| 亚洲福利免费| 99精品视频免费观看视频| 久久夜色精品亚洲噜噜国产mv | 亚洲午夜免费福利视频| 亚洲男人第一网站| 欧美freesex8一10精品| 一本一道久久综合狠狠老精东影业| 亚洲午夜电影在线观看| 久久综合中文色婷婷| 国产精品久久久免费| 亚洲精品中文字幕女同| 久久成人av少妇免费| 亚洲国产高清在线观看视频| 亚洲综合视频1区| 欧美区二区三区| 在线观看日韩精品| 欧美在线不卡视频| 亚洲精品乱码久久久久久日本蜜臀 | 欧美国产日韩视频| 亚洲欧美激情四射在线日| 欧美成人免费观看| 国产一区二区日韩精品| 亚洲欧美日韩另类| 99re66热这里只有精品3直播| 老**午夜毛片一区二区三区| 国产欧美日韩中文字幕在线| 亚洲一区二区在线视频| 亚洲免费av网站| 欧美激情亚洲精品| 亚洲精品美女久久7777777| 毛片精品免费在线观看| 久久成人一区| 国产主播精品| 久久久精品国产一区二区三区 | 亚洲乱码精品一二三四区日韩在线| 国产精品99久久不卡二区| 欧美日韩国产亚洲一区| 亚洲精品一区二区在线| 毛片一区二区| 久久精品最新地址| 一区二区三区在线高清| 久久久噜噜噜久久人人看| 午夜精彩视频在线观看不卡| 国产欧美日韩一区二区三区| 先锋资源久久| 亚洲综合精品| 国产日韩视频| 久久婷婷蜜乳一本欲蜜臀| 欧美中文日韩| 亚洲大黄网站| 亚洲第一精品久久忘忧草社区| 久久精品99国产精品| 精久久久久久久久久久| 欧美高清视频| 久久综合中文色婷婷| 一区在线电影| 久久精品系列| 久久久国产精品亚洲一区| 国产欧美在线观看| 久久九九99视频| 欧美精品一区二| 一区二区三区黄色| 亚洲在线观看免费视频| 久久综合激情| 99re8这里有精品热视频免费| 91久久精品国产91性色| 欧美1区3d| 99re热精品| 亚洲一区二区三区免费视频| 国产欧美视频一区二区| 久热国产精品视频| 欧美高清成人| 欧美一级久久久| 久久久久久久国产| 99精品99久久久久久宅男| 在线综合视频| 影音先锋在线一区| 亚洲精品男同| 国模私拍一区二区三区| 亚洲国产日韩综合一区| 国产精品日本精品| 亚洲第一在线视频| 国产日韩av高清| 亚洲国产美国国产综合一区二区| 欧美午夜宅男影院| 欧美国产精品v| 国产精品护士白丝一区av| 免费观看欧美在线视频的网站| 欧美日韩一区在线观看视频| 久久欧美中文字幕| 国产精品扒开腿做爽爽爽软件| 久久亚洲捆绑美女| 国产精品久久久久免费a∨| 欧美aaaaaaaa牛牛影院| 国产精品毛片| 亚洲精品中文在线| 亚洲第一精品影视| 欧美影院久久久| 亚洲影音一区| 欧美人妖另类| 欧美大片91| 好看的亚洲午夜视频在线| 夜夜狂射影院欧美极品| 亚洲日本无吗高清不卡| 久久久久99| 久久久xxx| 国产精品综合av一区二区国产馆| 91久久嫩草影院一区二区| **性色生活片久久毛片| 午夜精品免费| 亚洲欧美激情精品一区二区| 欧美成人免费全部观看天天性色| 亚洲激情中文1区| 欧美精品一区在线观看| 欧美韩日视频| 在线观看三级视频欧美| 欧美中文字幕在线| 欧美在线综合| 国产欧美日韩视频一区二区| 一区二区三区日韩| 亚洲永久在线观看| 国产精品v欧美精品∨日韩| 亚洲精品欧美精品| 99亚洲一区二区| 欧美日韩一区二| 一本色道久久综合亚洲精品按摩| 一本色道久久99精品综合| 欧美日韩亚洲成人| 在线亚洲欧美| 久久激五月天综合精品| 国产麻豆午夜三级精品| 欧美亚洲一区二区在线观看| 欧美制服丝袜第一页| 国产欧美日韩一区二区三区| 欧美一区二区三区免费视| 久久久久久伊人| 亚洲国产aⅴ天堂久久| 欧美成人激情视频| 亚洲精品久久久久久久久久久久久| 日韩视频在线一区二区三区| 欧美精品久久天天躁| 99视频在线精品国自产拍免费观看 | 一区二区三区|亚洲午夜| 欧美日韩国产小视频| 亚洲一区免费在线观看| 久久九九99| 亚洲毛片在线| 国产精品一区二区三区久久| 久久国产精品高清| 亚洲精品久久久蜜桃| 久久se精品一区二区| 一区二区三区无毛| 欧美色图首页| 久久久久久亚洲精品中文字幕| 亚洲福利在线看| 性欧美精品高清| 亚洲国内精品在线| 国产精品一区=区| 蜜臀99久久精品久久久久久软件| 99国产精品久久久久久久久久 | 国产精品一区三区| 老司机亚洲精品| 亚洲视频axxx| 亚洲大胆人体在线| 欧美一区二区三区免费看| 亚洲国产精品成人综合色在线婷婷| 欧美日韩在线免费| 久久中文精品| 欧美亚洲综合另类| 亚洲日韩视频| 浪潮色综合久久天堂| 亚洲自拍三区| 亚洲精品美女在线| 国产日韩一区| 国产精品免费观看视频| 国产欧美日韩一区二区三区| 久久精品论坛| 亚洲精品视频免费| 久久综合中文字幕| 欧美亚洲三级|