Qt 之路 (07)—對話框(上)

       首先說明一點,在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 <QtGui/QDialog>

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它們的頭文件——當然,你想直接引入頭文件也可以,不過那樣的話編譯速度就會慢一些。
        好了,頭文件先說這些,下一篇再說源代碼啦!休息,休息一下!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章