在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

接著前一篇,下面是源代碼部分:

#include <QtGui> 
#include "finddialog.h" 

FindDialog::FindDialog(QWidget *parent) 
        : QDialog(parent) 
{ 
        label = new QLabel(tr("Find &what:")); 
        lineEdit = new QLineEdit; 
        label->setBuddy(lineEdit); 

        caseCheckBox = new QCheckBox(tr("Match &case")); 
        backwardCheckBox = new QCheckBox(tr("Search &backford")); 

        findButton = new QPushButton(tr("&Find")); 
        findButton->setDefault(true); 
        findButton->setEnabled(false); 

        closeButton = new QPushButton(tr("Close")); 

        connect(lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableFindButton(const QString&))); 
        connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked())); 
        connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); 

        QHBoxLayout *topLeftLayout = new QHBoxLayout; 
        topLeftLayout->addWidget(label); 
        topLeftLayout->addWidget(lineEdit); 

        QVBoxLayout *leftLayout = new QVBoxLayout; 
        leftLayout->addLayout(topLeftLayout); 
        leftLayout->addWidget(caseCheckBox); 
        leftLayout->addWidget(backwardCheckBox); 

        QVBoxLayout *rightLayout = new QVBoxLayout; 
        rightLayout->addWidget(findButton); 
        rightLayout->addWidget(closeButton); 
        rightLayout->addStretch(); 

        QHBoxLayout *mainLayout = new QHBoxLayout; 
        mainLayout->addLayout(leftLayout); 
        mainLayout->addLayout(rightLayout); 
        setLayout(mainLayout); 

        setWindowTitle(tr("Find")); 
        setFixedHeight(sizeHint().height()); 
} 

FindDialog::~FindDialog() 
{ 

} 

void FindDialog::findClicked() 
{ 
        QString text = lineEdit->text(); 
        Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseInsensitive : Qt::CaseSensitive; 
        if(backwardCheckBox->isChecked()) { 
                emit findPrevious(text, cs); 
        } else { 
                emit findNext(text, cs); 
        } 
} 

void FindDialog::enableFindButton(const QString &text) 
{ 
        findButton->setEnabled(!text.isEmpty()); 
}

CPP 文件要長一些哦——不過,它們的價錢也會更高,嘿嘿——嗯,來看代碼,第一行 include 的是QtGui。Qt 是分模塊的,記得我們建工程的時候就會問你,使用哪些模塊?QtCore?QtGui?QtXml?等等。這里,我們引入 QtGui,它包括了 QtCore 和 QtGui 模塊。不過,這并不是最好的做法,因為QtGui 文件很大,包括了 GUI 的所有組件,但是很多組件我們根本是用不到的——就像 Swing 的import,你可以 import 到類,也可以使用,不過都不會建議使用,這里也是一樣的。我們最好只引入需要的組件。不過,那樣會把文件變長,現(xiàn)在就先用 QtGui 啦,只要記得正式開發(fā)時不能這么用就好啦!

構造函數有參數初始化列表,用來調用父類的構造函數,相當于 Java 里面的 super()函數。這是 C++ 的相關知識,不是 Qt 發(fā)明的,這里不再贅述。

然后新建一個 QLabel。還記得前面的 Hello, world!里面也使用過 QLabel 嗎?那時候只是簡單的傳入一個字符串?。∵@里怎么是一個函數 tr()?函數 tr()全名是 QObject::tr(),被它處理的字符串可以使用工具提取出來翻譯成其他語言,也就是做國際化使用。這以后還會仔細講解,只要記住,Qt 的最佳實踐:如果你想讓你的程序國際化的話,那么,所有用戶可見的字符串都要使用 QObject::tr()!但是,為什么我們沒有寫 QObject::tr(),而僅僅是 tr()呢?原來,tr()函數是定義在 Object里面的,所有使用了 Q_OBJECT 宏的類都自動具有 tr()函數。

字符串中的&代表快捷鍵。注意看下面的 findButton 的 &Find,它會生成 Find 字符串,當你按下Alt+F 的時候,這個按鈕就相當于被點擊——這么說很難受,相信大家都明白什么意思。同樣,前面label 里面也有一個&,因此它的快捷鍵就是 Alt+W。不過,這個 label 使用了 setBuddy 函數,它的意思是,當 label 獲得焦點時,比如按下 Alt+W,它的焦點會自動傳給它的 buddy,也就是lineEdit???,這就是伙伴的含義(buddy 英文就是伙伴的意思)。

后面幾行就比較簡單了:創(chuàng)建了兩個 QCheckBox,把默認的按鈕設為 findButton,把 findButton 設為不可用——也就是變成灰色的了。

再下面是三個 connect 語句,用來連接信號槽。可以看到,當 lineEdit 發(fā)出 textChanged(const QString&)信號時,F(xiàn)indDialog 的 enableFindButton(const QString&)函數會被調用——這就是回調,是有系統(tǒng)自動調用,而不是你去調用——當 findButton 發(fā)出 clicked()信號時,F(xiàn)indDialog的 findClicked()函數會被調用;當 closeButton 發(fā)出 clicked()信號時,F(xiàn)indDialog 的 close()函數會被調用。注意,connect()函數也是 QObject的,因為我們繼承了 QObject,所以能夠直接使用。

后面的很多行語句都是 layout 的使用,雖然很復雜,但是很清晰——編寫 layout 布局最重要一點就是思路清楚,想清楚哪個套哪個,就會很好編寫。這里我們的對話框實際上是這個樣子的:

http://wiki.jikexueyuan.com/project/learn-road-qt/images/14.png" alt="" />

注意那個 spacer 是由 rightLayout 的 addStretch()添加的,就像彈簧一樣,把上面的組件“頂起來”。

最后的 setWindowTitle()就是設置對話框的標題,而 setFixedHeight()是設置成固定的高度,其參數值 sizeHint()返回“最理想”的大小,這里我們使用的是 height()函數去到“最理想”的高度。

好了,下面該編寫槽了——雖然說是 slot,但實際上它就是普通的函數,既可以和其他函數一樣使用,又可以被系統(tǒng)回調。

先看 findClicked()函數。首先取出 lineEdit的輸入值;然后判斷 caseCheckBox是不是選中,如果選中就返回 Qt::CaseInsensitive,否則返回 Qt::CaseSensitive,用于判斷是不是大小寫敏感的查找;最后,如果 backwardCheckBox被選中,就 emit(發(fā)出)信號 findPrevious(),否則 emit信號 findNext。

enableFindButton()則根據 lineEdit 的內容是不是變化——這是我們的 connect 連接的——來設置findButton 是不是可以使用,這個很簡單,不再說了。

這樣,F(xiàn)indDialog.cpp 也就完成了。下面編寫 main.cpp——其實 QtCreator 已經替我們完成了——

#include <QApplication> 

#include "finddialog.h" 

int main(int argc, char *argv[]) 
{ 
        QApplication app(argc, argv); 
        FindDialog *dialog = new FindDialog; 
        dialog->show(); 
        return app.exec(); 
}

運行一下看看我們的成果吧!

雖然很簡單,也沒有什么實質性的功能,但是我們已經能夠制作對話框了—— Qt 的組件成百上千,不可能全部介紹完,只能用到什么學什么,更重要的是,我們已經了解了其編寫思路,否則的話,即便是你拿著全世界所有的磚瓦,沒有設計圖紙,你也不知道怎么把它們組合成高樓大廈啊!

嘿嘿,下回見!

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