Qt學(xué)習(xí)之路 詳解 下篇
本文講解的是Qt學(xué)習(xí)之路Chapter,以對(duì)話(huà)框?yàn)閷?shí)例對(duì)象,請(qǐng)看內(nèi)容。
創(chuàng)建對(duì)話(huà)框
程序一般用于設(shè)置程序的選項(xiàng)和選擇.
類(lèi)中Q_OBJECT 宏表示要定義singnal和slot, signal和slot都是宏,Qt::CaseSensitivity 為枚舉類(lèi)型, 可取值Qt::CaseSensitive 和 Qt::CaseInsensitive, 表示匹配的靈敏度。
Qt最重要的模塊為 QtCore, QtGui, QtNetwork, QtOpenGL, QtScript, QtSql, QtSvg, QtXml,在比較大的程序中, 頭文件中包含其他的大頭文件, 不是合適的做法, 所以在頭文件中不要include QtGui ,tr 函數(shù)可以用于轉(zhuǎn)換該字符串至其他語(yǔ)言. label文本中的快捷鍵如&w,則按下alt+w則該label的buddy widget獲得焦點(diǎn).
addStretch 就像在該處增加了彈簧一樣顯示空白,slot和普通的C++成員函數(shù)相同, 可以是虛擬的, 可以被重載, 可以為公有, 保護(hù)或者私有函數(shù). 可以直接調(diào)用該函數(shù). 參數(shù)可以為任何類(lèi)型. ***不同的就是當(dāng)信號(hào)發(fā)出的時(shí)候就會(huì)自動(dòng)調(diào)用該slot函數(shù)
signal和slot
一個(gè)signal可以連接多個(gè)slot
多個(gè)signal可以連接一個(gè)slot
一個(gè)signal可以連接另一個(gè)signal
// 當(dāng)***個(gè)信號(hào)發(fā)出的時(shí)候, 就會(huì)發(fā)出第二個(gè)信號(hào)
- connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));
可以移除連接
- disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
signal和slot必須含有相同的參數(shù)和次序. 如果signal的參數(shù)多于slot的參數(shù)數(shù), 多余的參數(shù)則會(huì)拋棄.
在connect中, 參數(shù)不要寫(xiě)出名稱(chēng), 只需寫(xiě)出類(lèi)型即可.
signal和slot在QObject中實(shí)現(xiàn), 不僅僅局限于GUI程序. 可以為任意QObject派生類(lèi)所使用.
Qt的Meta-Object系統(tǒng)
該系統(tǒng)提供了兩個(gè)關(guān)鍵服務(wù): signals-slots 和 introspection(反省), introspection的功能是實(shí)現(xiàn)signals-slots的必要部分. 同時(shí)允許應(yīng)用程序員在運(yùn)行時(shí)期得到關(guān)于QObject派生類(lèi)的"meta-information", 其包含該對(duì)象支持的signals和slots列表以及類(lèi)名稱(chēng). 該機(jī)制支持屬性(Designer擴(kuò)展的)和文本翻譯(國(guó)際化), 并且為QtScript模塊的基礎(chǔ), 可動(dòng)態(tài)添加屬性.
Qt通過(guò)提供分離的工具moc來(lái)實(shí)現(xiàn)該meta-object系統(tǒng). 該機(jī)制的作用如下:
Q_OBJECT宏聲明一些introspection函數(shù), 這些函數(shù)必須在每個(gè)QObject派生類(lèi)中實(shí)現(xiàn): metaObject(), tr(), qt_metacall(),以及其他
moc工具生成Q_OBJECT所聲明函數(shù)和所有信號(hào)的實(shí)現(xiàn)
QObject的成員函數(shù)如connect和disconncet使用這些introspection函數(shù)來(lái)完成工作. 注意避免signal和slot的無(wú)限循環(huán)問(wèn)題,無(wú)論是手寫(xiě)代碼還是用Qt designer, 創(chuàng)建對(duì)話(huà)框都擁有以下相同的基本步驟:
創(chuàng)建和初始化子widget
將子widget放入layout中
設(shè)置tab次序
建立signal-slot連接
實(shí)現(xiàn)對(duì)話(huà)框自定義slot
ui文件生成的c++文件里所生成的UI類(lèi), 聲明了該form所有子widget和layout的成員變量. setupUi()函數(shù)初始化該form.
為了增加一些功能, 創(chuàng)建一個(gè)新類(lèi), 從QDialog和Ui::GoToCellDialog派生. 然后實(shí)現(xiàn)缺省的功能
Qt提供了三個(gè)內(nèi)建的validator類(lèi): QIntValidator , QDoubleValidator , 和 QRegExpValidator
QRegExpValidator 可以設(shè)置其父對(duì)象, 這樣就無(wú)需擔(dān)心刪除問(wèn)題, 因?yàn)楦笇?duì)象的刪除就必然要?jiǎng)h除其子對(duì)象, 并在屏幕刪除該對(duì)象
slot accept()函數(shù)將dialog的返回值設(shè)置為QDialog::Accepted()(等于1). reject則設(shè)置返回值為QDialog::Rejected()(等于0)
QLineEdit::hasAcceptableInput() 用驗(yàn)證器驗(yàn)證輸入內(nèi)容是否符合要求
QDialogButtonBox --- 一個(gè)widget, 含有指定的按鈕并使用正確的方式顯示, 拖動(dòng)Button Box widget至form
- buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
最常用的變形對(duì)話(huà)框?yàn)閿U(kuò)展對(duì)話(huà)框和多頁(yè)面對(duì)話(huà)框.
相同的widget由于其內(nèi)容不同, 則大小有可能不同, 如需設(shè)置相同大小則需要增加代碼:
- primaryColumnCombo->setMinimumSize(secondaryColumnCombo->sizeHint());
// secondaryColumnCombo的內(nèi)容為None, 比PrimaryColumnCombo的內(nèi)容要多, 所以重新設(shè)置
#p#
多頁(yè)面對(duì)話(huà)框
- QTabWidget --- 提供tab bar控制其內(nèi)置的QStackedWidget
- QListWidget 和 QStackedWidget 配合使用,
- QListWidget的當(dāng)前條目顯示哪個(gè)QStackedWidget顯示
- QListWidget::currentRowChanged() 信號(hào)連至 QStackedWidget::setCurrentIndex() 槽
- QTreeWidget 和 QStackedWidget 類(lèi)似QListWidget
動(dòng)態(tài)對(duì)話(huà)框
是指用Qt Designer創(chuàng)建的.ui文件在運(yùn)行期間創(chuàng)建的對(duì)話(huà)框. 而不是用.ui文件生成的C++代碼創(chuàng)建的對(duì)話(huà)框.
我們可以在運(yùn)行期間使用QUiLoader類(lèi)加載ui文件
- view plaincopy to clipboardprint?QUiLoader uiLoader;
- QFile file("sortdialog.ui");
- QWidget *sortDialog = uiLoader.load(&file);
- if (sortDialog) { ... } QUiLoader uiLoader;
- QFile file("sortdialog.ui");
- QWidget *sortDialog = uiLoader.load(&file);
- if (sortDialog) {
- ...
- }
我們可以使用QObject::findChild<T>()訪問(wèn)該form的子widget
- QComboBox *primaryColumnCombo =
- sortDialog->findChild<QComboBox *>("primaryColumnCombo");
- if (primaryColumnCombo) { ... }
- QComboBox *primaryColumnCombo =
- sortDialog->findChild<QComboBox *>("primaryColumnCombo");
- if (primaryColumnCombo) {
- ...
- }
QUiLoader 位于特定的庫(kù)里, 需要增加配置: CONFIG += uitools
內(nèi)置的widget和對(duì)話(huà)框類(lèi)
按鈕: QPushButton, QToolButton, QCheckBox, QRadioButton
單頁(yè)容器: QGroupBox, QFrame
多頁(yè)容器: QTabWidget, QToolBox
顯示條目: QListView, QTreeView, QTabView
顯示: QLabel, QLCDNumber, QProgress, QTextBrowser
輸入: QSpinBox, QDoubleSpinBox, QComboBox, QDateEdit, QTimeEdit, QDateTimeEdit, QScrollBar, QSlider, QTextEdit, QLineEdit, QDial
反饋對(duì)話(huà)框: QInputDialog, QProgressDialog, QMessageBox, QErrorMessage
顏色和字體對(duì)話(huà)框: QColorDialog, QFontDialog
文件和打印對(duì)話(huà)框: QPageSetupDialog, QFileDialog, QPrintDialog
滾動(dòng)條QScrollBar的基類(lèi)為 QAbstractScrollArea
Qt提供富文本(rich text), 支持多格式文本
QLabel支持純文本, HTML, 圖像
QTextBrowser為只讀QTextEdit, 可支持帶格式文本, 相對(duì)于QLabel, 可以用于顯示大量的文本內(nèi)容, 提供滾動(dòng)條, 鍵盤(pán)和鼠標(biāo)可以控制瀏覽.
QLineEditor支持validator, QTextEditor為QAbstractScrollArea的派生類(lèi), 可以輸入大量的文本. 可以設(shè)置輸入純文本還是富文本(rich text)
QLineEditor和QTextEditor都和剪貼板相關(guān)聯(lián)。
小結(jié):Qt學(xué)習(xí)之路內(nèi)容介紹完了,里面有很多我們要去學(xué)習(xí)的類(lèi),想要繼續(xù)了解的話(huà), 請(qǐng)參考: