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