QT程式設計入門系列文章之七——建立一個對話方塊(上)
首先說明一點,在C++ GUI Programming with Qt4, 2nd中,這一章連同以後的若干章一起,完成了一個比較完整的程式——一個模仿 Excel的電子表格。不過這個程式挺大的,而且書中也沒有給出完整的源代 碼,只是分段分段的——我不喜歡這個樣子,我想要看到我寫出來的是什麼東西,這是最主要的,而不是慢慢的過上幾章的內容才能看到自己的作品所以,我打算 換一種方式,每章只給出簡單的知識,但是每章都能夠執行出東西來。好了,扯完了,下面開始!
以前說的主要是一些基礎知識,現在我們來真 正做一個東西——一個查詢對話方塊。什麼?什麼叫查詢對話方塊?唉唉,先看看我們的最終作品吧!
好了,首先新建一個工程,就叫 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它們的標頭檔案——當然, 你想直接引入標頭檔案也可以,不過那樣的話編譯速度就會慢一些。
好了,標頭檔案先說這些,下一篇再說原始碼啦!