QT程式設計入門系列文章之七——建立一個對話方塊(上)

QT程式設計入門系列文章之七——建立一個對話方塊(上)

首先說明一點,在C++ GUI Programming with Qt4, 2nd中,這一章連同以後的若干章一起,完成了一個比較完整的程式——一個模仿 Excel的電子表格。不過這個程式挺大的,而且書中也沒有給出完整的源代 碼,只是分段分段的——我不喜歡這個樣子,我想要看到我寫出來的是什麼東西,這是最主要的,而不是慢慢的過上幾章的內容才能看到自己的作品所以,我打算 換一種方式,每章只給出簡單的知識,但是每章都能夠執行出東西來。好了,扯完了,下面開始!

以前說的主要是一些基礎知識,現在我們來真 正做一個東西——一個查詢對話方塊。什麼?什麼叫查詢對話方塊?唉唉,先看看我們的最終作品吧!

QT程式設計入門系列文章之七——建立一個對話方塊(上)

好了,首先新建一個工程,就叫 FindDialog吧!嗯,當然還是Qt Gui Application,然後最後一步注意,Base Dialog選擇QDialog,而不是預設的QMainWindow,因為我們要學習建立對話方塊嘛!名字隨便起,不過我就叫finddialog 啦!Ganarate form還是不要的。然後Finish就好了。

開啟finddialog。h,開始編寫標頭檔案。

#ifndef FINDDIALOG_H

#define FINDDIALOG_H

#include

class QCheckBox;

class QLabel;

class QLineEdit;

class QPushButton;

class FindDialog : public QDialog {

Q_OBJECT

public:

FindDialog(QWidget *parent = 0); ~FindDialog();

signals:

void findNext(const QString &str, Qt::CaseSensitivity cs); void findPrevious(const QString &str, Qt::CaseSensitivity cs);

private slots:

void findClicked();

void enableFindButton(const QString &text);

private:

QLabel *label;

QLineEdit *lineEdit;

QCheckBox *caseCheckBox;

QCheckBox *backwardCheckBox;

QPushButton *findButton;

QPushButton *closeButton;

};

#endif // FINDDIALOG_H

大家都是懂得C++的啊,所以什麼#ifndef,#define和#endif的含 義和用途就不再贅述了。

首先,宣告四個用到的類。這裡做的是前向宣告,否則的話是編譯不過的,因為編譯器不知道這些類是否存在。簡單來 說,所謂前向宣告就是告訴編譯器,我要用這幾個類,而且這幾個類存在,你就不要擔心它們存不存在的問題啦!

然後是我們的 FindDialog,繼承自QDialog。

下面是一個重要的東西:Q_OBJECT。這是一個宏。凡是定義訊號槽的類都必須宣告這 個宏。至於為什麼,我們以後再說。

然後是public的建構函式和解構函式宣告。

然後是一個signal:,這是 Qt的關鍵字——還記得前面說過的嘛?Qt擴充套件了C++語言,因此它有自己的關鍵字——這是對訊號的定義,也就是說,FindDialog有兩個 public的訊號,它可以在特定的時刻發出這兩個訊號,就這裡來說,如果使用者點選了 Find按鈕,並且選中了Search backward,就會發出findPrevious(),否則發出findNext()。

緊接著是private slots:的定義,和前面的signal一樣,這是私有的槽的定義。也就是說,FindDialog具有兩個槽,可以接收某些訊號,不過這兩個槽都是私 有的。

為了slots的定義,我們需要訪問 FindDialog的元件,因此,我們把其中的元件定義為成員變數以便訪問。正是因為需要 定義這些元件,才需要對它們的型別進行前向宣告。因為我們僅僅使用的是指標,並不涉及到這些類的函式,因此並不需要 include它們的標頭檔案——當然, 你想直接引入標頭檔案也可以,不過那樣的話編譯速度就會慢一些。

好了,標頭檔案先說這些,下一篇再說原始碼啦!