鍍金池/ 教程/ C/ 創(chuàng)建一個(gè)對(duì)話框(上)
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國(guó)際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國(guó)際化(上)
組件布局
自定義 Model 之三
事件過(guò)濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫(xiě)
自定義事件
編寫(xiě)跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫(xiě)
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(QWidget)

創(chuàng)建一個(gè)對(duì)話框(上)

首先說(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