天天看點

qt中charts的example中有哪些_Qt 建立一個對話框(下)

建立一個對話框(下)

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

#include #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 到類,也可以使用,不過都不會建議使用,這裡也是一樣的。我們最好隻引入需要的元件。不過,那樣會把檔案變長,現在就先用 QtGui 啦,隻要記得正式開發時不能這麼用就好啦!

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

然後建立一個 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 英文就是夥伴的意思)。

後面幾行就比較簡單了:建立了兩個 QCheckBox,把預設的按鈕設為 findButton,把 findButton 設為不可用——也就是變成灰色的了。

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

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

qt中charts的example中有哪些_Qt 建立一個對話框(下)

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

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

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

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

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

這樣,FindDialog.cpp 也就完成了。下面編寫 main.cpp——其實 QtCreator 已經替我們完成了——

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

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

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

嘿嘿,下回見!

qt中charts的example中有哪些_Qt 建立一個對話框(下)

繼續閱讀