2月 04, 2009

【翻譯】Qt Tutorial 4 - Let There Be Widgets

@
tutorials/tutorial/t4/main.cpp
tutorials/tutorial/t4/t4.pro

  這個範例展示了如何建立你自己的元件,並且描述了如何控制元件大小的最小值及最大值。



 #include <QApplication>
 #include <QFont>
 #include <QPushButton>
 #include <QWidget>

 class MyWidget : public QWidget
 {
 public:
     MyWidget(QWidget *parent = 0);
 };

 MyWidget::MyWidget(QWidget *parent)
     : QWidget(parent)
 {
     setFixedSize(200, 120);

     QPushButton *quit = new QPushButton(tr("Quit"), this);
     quit->setGeometry(62, 40, 75, 30);
     quit->setFont(QFont("Times", 18, QFont::Bold));

     connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
 }

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     MyWidget widget;
     widget.show();
     return app.exec();
 }


Line by Line Walkthrough

 class MyWidget : public QWidget
 {
 public:
     MyWidget(QWidget *parent = 0);
 };

  這裡我們建立了一個新的類別。因為這個類別繼承自 QWidget,所以這個新類別是個元件,並且可以為一個最上層的視窗或是一個子元件(就像是先前章節裡的 QPushButton)。

  這個類別只有一個成員,一個建構子(constructor)(再加上繼承自 QWidget 的成員)。這個建構子是一個標準的 Qt 元件建構子。當你建立元件時,你總是需要包含一個類似的建構子。

  這個引數是它的父元件。為了建立一個最上層視窗,你將父元件指定為一個空指標。就像你所看到的,這個元件預設是作為一個最上層視窗。

 MyWidget::MyWidget(QWidget *parent)

  建構子的實現(implementation)從這裡開始。就像許多元件一樣,它只是把 parent 傳遞給 QWidget 的建構子。

     : QWidget(parent)
 {
     setFixedSize(200, 120);

  因為這個元件並不曉得如何處理改變大小(resize),所以我們固定(fix)了它的大小。在下一個章節,我們將展示一個元件是如何回應使用者的改變大小事件的。

     QPushButton *quit = new QPushButton(tr("Quit"), this);
     quit->setGeometry(62, 40, 75, 30);
     quit->setFont(QFont("Times", 18, QFont::Bold));

  這裡我們建立並設定了一個這個元件的子元件(這個新元件的父元件為 this,在這個例子中即為 MyWidget)。

  tr() 的函式呼叫環繞(around)了 "Quit" 這個字面上的字串,用以標記這個字串是可以翻譯(translation)的,使它能夠在執行期(run-time)根據翻譯檔的內容作改變。在你決定以後要將你的應用程式翻譯為其他語言的情況下,使用 tr() 環繞所有使用者可見的字串是一個好習慣。

  記得這個 quit 是這個建構子裡的一個局部(local)變數,MyWidget 無法追蹤到它。但是 Qt 可以、且將會自動地在 MyWidget 被刪除(delete)時刪除掉它。這就是為什麼 MyWidget 不需要解構子的原因。(另一方面,當你決定要刪除一個子元件時,也沒什麼壞處。這個子元件會自動告知 Qt 它即將死亡。)

  QWidget::setGeometry() 設定了元件的螢幕位置以及大小。這等同於呼叫 QWidget::move() 之後緊接著呼叫 QWidget::resize()。

     connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
 }

  qApp 指標是宣告在 <QApplication> 標頭檔裡的一個全域變數。它指向應用程式中的唯一一個 QApplication 實體(instance)。

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     MyWidget widget;
     widget.show();
     return app.exec();
 }

  這裡我們實體化我們的新子元件,顯示它、並且執行這支程式。


Running the Application

  這支程式的行為相當類似前一個章節。不同的地方在於我們實現它的方式。無論如何,它的行為上還是會有點微小差異。試看看改變它的大小吧。


Exercises

  試著在 main() 中建立另一個 MyWidget。發生什麼事?

  試著加入更多按鈕,或是把 QPushButton 以外的東西放在元件裡。


來源:Qt Tutorial 4 - Let There Be Widgets
版本:4.4.3

1 回覆:

Saitor & Loki 提到...

試著在 main() 中建立另一個 MyWidget
...開了兩個-_-b

張貼留言