Qt 創(chuàng)建一個對話框(上)

2022-11-29 10:50 更新

創(chuàng)建一個對話框(上)

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

以前說的主要是一些基礎(chǔ)知識,現(xiàn)在我們來真正做一個東西——一個查找對話框。什么?什么叫查找對話框?唉唉,先看看我們的最終作品吧!

好了,首先新建一個工程,就叫 FindDialog 吧!嗯,當(dāng)然還是 Qt Gui Application,然后最后一步注意,Base Dialog 選擇 QDialog,而不是默認(rèn)的 QMainWindow,因?yàn)槲覀円獙W(xué)習(xí)建立對話框嘛!名字隨便起,不過我就叫 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 的含義和用途就不再贅述了。

首先,聲明四個用到的類。這里做的是前向聲明,否則的話是編譯不過的,因?yàn)榫幾g器不知道這些類是否存在。簡單來說,所謂前向聲明就是告訴編譯器,我要用這幾個類,而且這幾個類存在,你就不要擔(dān)心它們存不存在的問題啦!

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

下面是一個重要的東西:Q_OBJECT。這是一個宏。凡是定義信號槽的類都必須聲明這個宏。至于為什么,我們以后再說。

然后是 public 的構(gòu)造函數(shù)和析構(gòu)函數(shù)聲明。

然后是一個 signal:,這是 Qt 的關(guān)鍵字——還記得前面說過的嘛?Qt 擴(kuò)展了 C++ 語言,因此它有自己的關(guān)鍵字——這是對信號的定義,也就是說,F(xiàn)indDialog 有兩個 public 的信號,它可以在特定的時刻發(fā)出這兩個信號,就這里來說,如果用戶點(diǎn)擊了 Find 按鈕,并且選中了 Search backward,就會發(fā)出 findPrevious(),否則發(fā)出 findNext()。

緊接著是 private slots:的定義,和前面的 signal 一樣,這是私有的槽的定義。也就是說,F(xiàn)indDialog 具有兩個槽,可以接收某些信號,不過這兩個槽都是私有的。

為了 slots 的定義,我們需要訪問 FindDialog 的組件,因此,我們把其中的組件定義為成員變量以便訪問。正是因?yàn)樾枰x這些組件,才需要對它們的類型進(jìn)行前向聲明。因?yàn)槲覀儍H僅使用的是指針,并不涉及到這些類的函數(shù),因此并不需要 include 它們的頭文件——當(dāng)然,你想直接引入頭文件也可以,不過那樣的話編譯速度就會慢一些。

好了,頭文件先說這些,下一篇再說源代碼啦!休息,休息一下!

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號