9月 14, 2008

【筆記】Small Test of Qt

@
  看完官方的 Qt Tutorial 文件之後,想自己實際寫一次 Qt 的程式。在這裡,我想盡量依照我寫的過程將程式碼列出來,所以內文的順序並不是實際程式碼的順序。建議可以對照著完整原始碼來看。


 #define WIDTH   290
 #define HEIGHT  140

  首先,為了方便起見,我直接使用前置處理器定義了程式的寬度(WIDTH = 290)與高度(HEIGHT = 140)。


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

  接著,建立一個 QApplication,並傳遞 main() 函式的 argc 與 argv 引數作為其建構子參數。

  然後在程式的最後,利用 QApplication::exec() 函式將 main() 函式的主控權交給 Qt,並將執行結果作為返回值。

    QWidget *window = new QWidget;
    window->setWindowTitle("Hello, Qt!");
    window->setMinimumSize(WIDTH, HEIGHT);
    window->setMaximumSize(WIDTH, HEIGHT);

  現在需要一個頂層元件來作為一個視窗。

  在這裡,我直接使用 QWidget 作為頂層元件。同時,指定其標題為"Hello, Qt!",並使用 setMinimumSize() 與 setMaximumSize 固定其寬度與高度。

  而這裡使用的 WIDTH 與 HEIGHT 就是在前面提到,使用前置處理器定義的。


  空空的視窗還滿無聊的。所以我加入了一個 QLabel 元件。

    QLabel *label = new QLabel("<center>Test</center>", window);
    label->setFont(QFont("Courier New", 25, QFont::Bold));
    label->setGeometry(0, 0, 290, 70);

  沒什麼作用,這個 Label 只是擺好看的。

  文字內容是"Test",並使用 HTML 標籤來作置中。然後使用 QWidget::setFont() 設定文字的字體,並使用 QWidget::setGeometry() 來設定標籤的位置。


    QPushButton *quit = new QPushButton("&Quit", window);
    quit->setFont(QFont("Monotype Corsiva", 25, QFont::Bold));
    quit->setGeometry(5, 75, 280, 60);

    QObject::connect(quit, SIGNAL(clicked()), &app, SLOT(quit()));

  這是模仿 Qt Tutorial 文件加入的 Quit 按鈕。同樣是設定好字體及標籤位置之後,使用 QObject::connect() 將 quit 的 clicked() signal 連結到 app 的 quit() slot。


     window->show();

  接著將把視窗設為可見。


  這樣差不多了吧?不過我想,只有一個沒用的標籤跟一個 Quit 按鈕的程式實在太無聊。所以現在,我還要對這個視窗做一點小手腳:

    QSize size = app.desktop()->size();
    window->move((size.width() - WIDTH) / 2, (size.height() - HEIGHT) / 2);

  首先,我藉由 QApplication::desktop() 取得一個 QDesktopWidget 元件,其提供了程式所在螢幕的相關資訊。接著就可以直接利用 QWidget::size() 取得螢幕的大小。

  需要注意的是,為了要使用 QApplication::desktop(),在這裡我們需要引入 <QDesktopWidget> 這個標頭檔。

  根據螢幕及視窗大小,計算出擺放位置後,再使用 QWidget::move() 做移動。這樣每次啟動程式時,視窗就會自動移動到螢幕的正中央了。


  實際的原始碼如下:

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QDesktopWidget>

#define WIDTH   290
#define HEIGHT  140

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Hello, Qt!");
    window->setMinimumSize(WIDTH, HEIGHT);
    window->setMaximumSize(WIDTH, HEIGHT);

    // 調整視窗至螢幕中央
    QSize size = app.desktop()->size();
    window->move((size.width() - WIDTH) / 2, (size.height() - HEIGHT) / 2);
 
    // 建立並設定元件
    QLabel *label = new QLabel("<center>test</center>", window);
    label->setFont(QFont("Courier New", 25, QFont::Bold));
    label->setGeometry(0, 0, 290, 70);

    QPushButton *quit = new QPushButton("&Quit", window);
    quit->setFont(QFont("Monotype Corsiva", 25, QFont::Bold));
    quit->setGeometry(5, 75, 280, 60);

    QObject::connect(quit, SIGNAL(clicked()), &app, SLOT(quit()));

    window->show();

    return app.exec();
}

  編譯執行之後的結果:




  有實際編譯出來的人可以試看看改變視窗大小,或是按下最大化按鈕。

  雖說到目前為止,這程式應該還滿無聊的。不過自己實際寫一遍,還是比看著範例打來得好一點?

0 回覆:

張貼留言