首先說(shuō)明一點(diǎn),在 C++ GUI Programming with Qt4, 2nd 中,這一章連同以后的若干章一起,完成了一個(gè)比較完整的程序——一個(gè)模仿 Excel 的電子表格。不過(guò)這個(gè)程序挺大的,而且書(shū)中也沒(méi)有給出完整的源代碼,只是分段分段的——我不喜歡這個(gè)樣子,我想要看到我寫(xiě)出來(lái)的是什么東西,這是最主要的,而不是慢慢的過(guò)上幾章的內(nèi)容才能看到自己的作品。所以,我打算換一種方式,每章只給出簡(jiǎn)單的知識(shí),但是每章都能夠運(yùn)行出東西來(lái)。好了,扯完了,下面開(kāi)始!
以前說(shuō)的主要是一些基礎(chǔ)知識(shí),現(xiàn)在我們來(lái)真正做一個(gè)東西——一個(gè)查找對(duì)話框。什么?什么叫查找對(duì)話框?唉唉,先看看我們的最終作品吧!
http://wiki.jikexueyuan.com/project/learn-road-qt/images/13.png" alt="" />
好了,首先新建一個(gè)工程,就叫 FindDialog 吧!嗯,當(dāng)然還是 Qt Gui Application,然后最后一步注意,Base Dialog 選擇 QDialog,而不是默認(rèn)的 QMainWindow,因?yàn)槲覀円獙W(xué)習(xí)建立對(duì)話框嘛!名字隨便起,不過(guò)我就叫 finddialog 啦!Ganarate form 還是不要的。然后 Finish 就好了。
打開(kāi) finddialog.h,開(kāi)始編寫(xiě)頭文件。
#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 的含義和用途就不再贅述了。
首先,聲明四個(gè)用到的類。這里做的是前向聲明,否則的話是編譯不過(guò)的,因?yàn)榫幾g器不知道這些類是否存在。簡(jiǎn)單來(lái)說(shuō),所謂前向聲明就是告訴編譯器,我要用這幾個(gè)類,而且這幾個(gè)類存在,你就不要擔(dān)心它們存不存在的問(wèn)題啦!
然后是我們的 FindDialog,繼承自 QDialog。
下面是一個(gè)重要的東西:Q_OBJECT。這是一個(gè)宏。凡是定義信號(hào)槽的類都必須聲明這個(gè)宏。至于為什么,我們以后再說(shuō)。
然后是 public 的構(gòu)造函數(shù)和析構(gòu)函數(shù)聲明。
然后是一個(gè) signal:,這是 Qt 的關(guān)鍵字——還記得前面說(shuō)過(guò)的嘛?Qt 擴(kuò)展了 C++ 語(yǔ)言,因此它有自己的關(guān)鍵字——這是對(duì)信號(hào)的定義,也就是說(shuō),F(xiàn)indDialog 有兩個(gè) public 的信號(hào),它可以在特定的時(shí)刻發(fā)出這兩個(gè)信號(hào),就這里來(lái)說(shuō),如果用戶點(diǎn)擊了 Find 按鈕,并且選中了 Search backward,就會(huì)發(fā)出 findPrevious(),否則發(fā)出 findNext()。
緊接著是 private slots:的定義,和前面的 signal 一樣,這是私有的槽的定義。也就是說(shuō),F(xiàn)indDialog 具有兩個(gè)槽,可以接收某些信號(hào),不過(guò)這兩個(gè)槽都是私有的。
為了 slots 的定義,我們需要訪問(wèn) FindDialog 的組件,因此,我們把其中的組件定義為成員變量以便訪問(wèn)。正是因?yàn)樾枰x這些組件,才需要對(duì)它們的類型進(jìn)行前向聲明。因?yàn)槲覀儍H僅使用的是指針,并不涉及到這些類的函數(shù),因此并不需要 include 它們的頭文件——當(dāng)然,你想直接引入頭文件也可以,不過(guò)那樣的話編譯速度就會(huì)慢一些。
好了,頭文件先說(shuō)這些,下一篇再說(shuō)源代碼啦!休息,休息一下!
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031