顯示具有 Qt 標籤的文章。 顯示所有文章
顯示具有 Qt 標籤的文章。 顯示所有文章

快快樂樂學 QT - 第一章 Getting Started (2)

Making Connections

在下一個例子當中,將會告訴我們如何對使用者的動作做出回應。這個程式包含了一個按鈕,當使用者點了這個按鈕之後,程式就會離開。這個程式跟 Hello 這隻相當類似,主要差別在於我們用 QPushButton 來代替 QLabel以下是範例:
1  #include <qapplication.h>
2  #include <qpushbutton.h>

3  int main( int argc, char *argv[] )
4  {
5      QApplication app(argc, argv) ;
6      QPushButton *button = new QPushButton("Quit", 0) ;
7      QObject::connect(button, SIGNAL( clicked() ),
8                               &app, SLOT( quit() )) ;
9      app.setMainWidget(button) ;
10     button->show() ;
11     return app.exec() ;
12 }

QT 的 widget 透過 signals 表示使用者的動作或者是狀態的改變。舉例來說,QPushButton會在使用者按下按鈕的時候,發出一個 clicked() signal。Signal 可以跟 function 作連結(接下來這個 function 我們會稱作 slot),也就是說,當一個 signal 被發出的時候,slot 就會自動的被執行。

在我們的例子當中,我們把按鈕的 clicked() signal 跟 QApplication 物件的 quit() slot 做了連結,SIGNAL() 以及 SLOT() 這兩個 macros 是 Qt 語法的一部分,在下一章當中會有更詳細的解釋。

接著我們就來 build 並且執行這個程式,當程式執行之後,如果你按下了 Quit,或是按下空白鍵(代表按下 Quit 按鈕),你會發現程式會結束執行。

下一個例子則是展示了如何利用 signals 以及 slots 讓兩個 widget 同步,這個程式詢問使用者的年紀,使用者可以透過一個 spin box 或是 slider 來作輸入。 程式包含了三個 widgets:QSpinBoxQSliderQHBox (horizontal layout box)。QHBox 是程式的 main widget,QSpinBox 以及 QSlider 被放在 QHBox 裡面,它們兩個是 QHBoxchildren

1  #include <qapplication.h>
2  #include <qhbox.h>
3  #include <qslider.h>
4  #include <qspinbox.h>

5  int main( int argc, char *argv[] )
6  {
7      QApplication app(argc,argv) ;
8      QHBox *hbox = new QHBox(0) ;
9      hbox->setCaption("Enter Your Age") ;
10     hbox->setMargin(6) ;
11     hbox->setSpacing(6) ;

12     QSpinBox *spinBox = new QSpinBox(hbox) ;
13     QSlider *slider = new QSlider(Qt::Horizontal, hbox) ;
14     spinBox->setRange(0,130) ;
15     slider->setRange(0,130) ;

16     QObject::connect(spinBox, SIGNAL(valueChanged(int)),
17                              slider, SLOT(setValue(int))) ;
18     QObject::connect(slider, SIGNAL(valueChanged(int)),
19                              spinBox, SLOT(setValue(int))) ;
20     spinBox->setValue(35) ;
21     app.setMainWidget(hbox);
22     hbox->show() ;
23     return app.exec() ;
24  }


第 8 行到第 11 行我們對 QHBox 做了一些設定,我們在 QHBox 的外圍以及跟 child widget 之間留了一些空間 (6 pixels)。12 和 13 行我們產生了行我們產生了 QSpinBox 以及 QSlider 物件,並且把他們兩個的 parent 都設定為 QHBox

儘管我們沒有明確設定這兩個 widget 的位置以及大小,我們仍然會發現 QSpinBox 還有 QSliderQHBox 當中躺的好好的,這是因為 QHBox 會自動的給他的 child 合理的位置還有大小。Qt 提供了許多像是 QHBox 之類的 classes 讓我們不用刻意去指定 widget 的位置以及大小。

14 以及 15 行設定了 spin box 以及 slider 的合法範圍,16 到 19 行的兩個 connect 則是讓 spin box 以及 slider 作同步的動作,使他們兩個都會有相同的值。當任何一個 widget 的值改變,就會丟出 valueChanged(int) 的 signal,連接到另外一個 widget 的 setValue(int) slot,並且跟著改變值。

第 20 行把 spin box 的值設定為 35,當跑到這一行時,QSpinBox 發出了 valueChanged(int) 的 signal,並且還有一個值為 35 的 int argument。這個 arguemnt 會被傳到 QSlidersetValue(int) slot,把 slider 的值設成 35。接著 slider 又會因為 slider 的值改變了而送出一個 valueChanged(int) 的 signal,不過在這個時候,因為 spin box 的值已經是 35 了,所以不會有 setValue(int) 的發生。這樣可以避免無窮迴圈的狀況發生。

總結一下,Qt 建造使用者介面的方法相當簡單易懂而且有彈性,並且透過 layout,我們可以不用擔心 widget 的大小還有位置問題。UI 的行為則是透過 widget 之間的 signals 還有 slots 機制來作管理。

快快樂樂學 QT - 第一章 Getting Started (1)

這一章是我們簡介 QT 的開始,我們將會由一個最經典的 "Hello QT" 的例子,先讓大家看看 QT 的程式會長什麼樣子。在此,也會介紹兩個 QT 的概念:"siganls and slots" 以及 layouts。

Hello Qt

那麼,先讓我們來看看 "Hello QT" 這個程式:
1  #include <qapplication.h>
2  #include <qlabel.h>

3  int main( int argc, char *argv[] )
4  {
5      QApplication app(argc, argv) ;
6      QLabel *label = new QLabel("Hello Qt!", 0) ;
7      app.setMainWidget(label) ;
8      label->show() ;
9      return app.exec() ;
10 }

第一、二行 include 了 QApplication 還有 QLabel 這兩個類別的 definitions,第五行建構了一個 QApplication 的物件來管理程式的資源,QApplication 的 constructor 需要 argc 以及 argv 當作參數。這是因為 QT 也支援了一些 command-line arguments。

第六行建構了顯示 "Hello Qt!" 的 QLabel widget,在 Qt 當中,一個 widget 指的就是一個 UI 上面的視覺元素。按鈕、選單、捲軸等等,都是 widget 的例子。Widget 當中也可以包含其他的 widgets,舉例來說,一個程式的視窗就是一個 widget,通常會包含 QMenuBarQToolBarQStatus,還有一些其他的 widget。後面傳給 QLabel constructor 的參數 0 (null pointer) 代表這個 widget 所在的視窗就是他自己,而不是一個在其他視窗當中的 widget。

第七行把 label 設定成程式的主要 widget,當使用者把主要 widget 關掉之後,程式就會結束。如果沒有設定主要 widget,程式會在關掉視窗之後依舊在背景一直執行。第八行讓 label 可以被看到,在 widgets 剛被建構的時候都是被設定為隱藏的,這樣我們可以在 widgets 被看到之前先對它們作設定。第九行把程式控制權傳給 Qt,在這個時候,程式進入到一種 stand-by 模式,等待使用者滑鼠、鍵盤等等的動作。

現在讓我們來測試一下程式吧!首先,我們需要先安裝 Qt3。我們假設你已經把 Qt3 裝好了,並且已經把 Qt 的 bin 目錄設定在你的 PATH 環境變數當中。

現在我們可以把這個程式取名叫做 hello.cpp,並且把他放在一個叫做 hello 的目錄當中。利用命令列,先切換你的目錄到 hello,打入
qmake -project
來創造一個跟平台無關的專案檔案 (hello.pro),接著再打入
qmake hello.pro
來從專案檔案當中創造一個平台相關的 makefile,執行 make 來 build 這個程式,接著執行 hello,就會看到程式的結果跑出來。

接著讓我們再來試試看一些東西,我們可以在 label 上面動一些手腳,透過插入一些簡單的 HTML-style 標籤格式,只要把這行
QLabel *label = new QLabel("Hello Qt!", 0) ;
改成
QLabel *label = new QLabel("<h2><i>Hello</i> ""<font color=red>Qt!</font></h2>", 0) ;
然後再 rebuilding 這個程式就可以看到新的結果。

快快樂樂學 QT - 前言

我知道這個標題很蠢,不過一時之間我想不到什麼其他好標題 XD

這串文章主要是記錄一些我學習 QT 的心得,主要是依照 C++ GUI Programming with Qt3 的內容為主,然後會附上一些自己的心得。大致的把學習過程作個記錄,以後也可以給有需要的人稍微作個參考。在這裡,我還是會以 QT3 為主軸。原因很簡單,儘管 QT4 已經推出一段時間了,但是因為目前手上只有這本書,因此為了不必要的麻煩,就先以 QT3 為基準。等到整本書看的差不多之後,再去就兩個版本之間不同之處來作比較。
 

Popular Posts