QDialog類是對話框窗口的基類。
頭文件:#include <QDialog>
qmake:QT += widgets
繼承:QWidget
被繼承:QColorDialog, QErrorMessage, QFileDialog, QFontDialog, QInputDialog, QMessageBox, QProgressDialog, and QWizard
對話窗口是頂級窗口,主要用於短期任務和與用戶的簡短通信。 QDialogs可能是模態的或無模式的。 QDialogs可以提供返回值,它們可以有默認按鈕。 QDialogs也可以使用setSizeGripEnabled()在其右下角有一個QSizeGrip。
請注意,QDialog(以及具有Qt :: Dialog類型的任何其他窗口小部件)使用父窗口小部件與Qt中的其他類略有不同。 對話框始終是頂級窗口小部件,但如果它具有父窗口,則其默認位置居中於父級頂級窗口小部件的頂部(如果它不是頂級窗口小部件)。 它還將共享父級的任務欄條目。
使用QWidget :: setParent()函數的重載來更改QDialog小部件的所有權。 此函數允許您顯式設置重新定義的窗口小部件的窗口標誌; 使用重載函數將清除窗口標誌,指定窗口小部件的窗口系統屬性(特別是它將重置Qt :: Dialog標誌)。
模態對話框
模態對話框是一個對話框,用於阻止同一應用程序中其他可見窗口的輸入。 用於從用戶請求文件名或用於設置應用程序首選項的對話框通常是模態的。 對話框可以是應用程序模式(默認)或窗口模式。
打開應用程序模式對話框時,用戶必須完成與對話框的交互並關閉它,然後才能訪問應用程序中的任何其他窗口。 窗口模式對話框僅阻止訪問與對話框關聯的窗口,允許用戶繼續使用應用程序中的其他窗口。
顯示模式對話框的最常用方法是調用其exec()函數。 當用戶關閉對話框時,exec()將提供有用的返回值。 通常,要使對話框關閉並返回適當的值,我們會連接一個默認按鈕,例如 好的,到accept()插槽和拒絕()插槽的取消按鈕。 或者,您可以使用Accepted或Rejected調用done()槽。
另一種方法是調用setModal(true)或setWindowModality(),然後調用show()。 與exec()不同,show()立即將控制權返回給調用者。 調用setModal(true)對於進度對話框特別有用,其中用戶必須能夠與對話框進行交互,例如, 取消長時間運行的操作。 如果同時使用show()和setModal(true)執行長操作,則必須在處理期間定期調用QApplication :: processEvents()以使用戶能夠與對話框進行交互。 (見QProgressDialog。)
無模式對話框
無模式對話框是一個獨立於同一應用程序中其他窗口的對話框。 在字處理器中查找和替換對話框通常是無模式的,以允許用戶與應用程序的主窗口和對話框進行交互。
使用show()顯示無模式對話框,它會立即將控制權返回給調用者。
如果在隱藏對話框後調用show()函數,則對話框將顯示在其原始位置。 這是因爲窗口管理器決定程序員未明確放置的窗口的位置。 要保留用戶移動的對話框的位置,請將其位置保存在closeEvent()處理程序中,然後將對話框移動到該位置,然後再顯示該對話框。
默認按鈕
對話框的默認按鈕是用戶按Enter(返回)時按下的按鈕。 此按鈕用於表示用戶接受對話框的設置並希望關閉對話框。 使用QPushButton :: setDefault(),QPushButton :: isDefault()和QPushButton :: autoDefault()來設置和控制對話框的默認按鈕。
退出鍵
如果用戶在對話框中按下Esc鍵,將調用QDialog :: reject()。 這將導致窗口關閉:關閉事件不能被忽略。
可擴展性
可擴展性是以兩種方式顯示對話框的能力:顯示最常用選項的部分對話框,以及顯示所有選項的完整對話框。 通常,可擴展對話框最初將顯示爲部分對話框,但具有“更多”切換按鈕。 如果用戶按下“更多”按鈕,則會展開對話框。 擴展示例顯示瞭如何使用Qt實現可擴展對話框。
返回值(模態對話框)
模態對話框通常用於需要返回值的情況,例如: 指示用戶是按下確定還是取消。 可以通過調用accept()或reject()槽來關閉對話框,exec()將根據需要返回Accepted或Rejected。 exec()調用返回對話框的結果。 如果對話框尚未銷燬,結果也可以從result()獲得。
爲了修改對話框的關閉行爲,您可以重新實現函數accept(),reject()或done()。 只應重新實現closeEvent()函數以保留對話框的位置或覆蓋標準關閉或拒絕行爲。
代碼實例
一個模式對話框
void EditorWindow::countWords()
{
WordCountDialog dialog(this);
dialog.setWordCount(document().wordCount());
dialog.exec();
}
一個無模式對話框
void EditorWindow::find()
{
if (!findDialog) {
findDialog = new FindDialog(this);
connect(findDialog, SIGNAL(findNext()), this, SLOT(findNext()));
}
findDialog->show();
findDialog->raise();
findDialog->activateWindow();
}
另請參閱QDialogButtonBox,QTabWidget,QWidget,QProgressDialog,GUI設計手冊:對話框,標準,擴展示例和標準對話框示例。
一、成員類型文檔
模態對話框返回的值。
常量 | 值 |
QDialog::Accepted |
1 |
QDialog::Rejected | 0 |
二、屬性文檔
此屬性保持show()是否應將對話框彈出爲模態或無模式。
默認情況下,此屬性爲false,show()將對話框彈出爲無模式。 將其屬性設置爲true等同於將QWidget :: windowModality設置爲Qt :: ApplicationModal。
exec()忽略此屬性的值,並始終將對話框彈出爲模態。
訪問函數:
bool isModal() const
void setModal(bool modal)
另請參見QWidget :: windowModality,show()和exec()。
此屬性保持是否啓用尺寸夾點。
啓用此屬性後,QSizeGrip將放置在對話框的右下角。 默認情況下,禁用大小夾點。
訪問函數:
bool isSizeGripEnabled() const
void setSizeGripEnabled(bool)
三、成員函數文檔
QDialog::QDialog(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
構造父父對話框。
對話框始終是頂級窗口小部件,但如果它具有父窗口,則其默認位置以父窗體爲中心。 它還將共享父級的任務欄條目。
小部件標誌f被傳遞給QWidget構造函數。 例如,如果您不想在對話框的標題欄中顯示“這是什麼”按鈕,請傳遞Qt :: WindowTitleHint | ft :: WindowSystemMenuHint in f。
另請參見QWidget :: setWindowFlags()。
銷燬QDialog,刪除其所有孩子。
[virtual slot] void QDialog::accept()
隱藏模態對話框並將結果代碼設置爲Accepted。
另請參見reject()和done()。
[signal] void QDialog::accepted()
當用戶接受對話框或通過使用QDialog :: Accepted參數調用accept()或done()時,將發出此信號。
請注意,使用hide()或setVisible(false)隱藏對話框時不會發出此信號。 這包括在對話框可見時刪除對話框。
該函數在Qt 4.1中引入。
另請參見finished()和rejected()。
[virtual protected] void QDialog::closeEvent(QCloseEvent *e)
從QWidget :: closeEvent()重新實現。
[virtual protected] void QDialog::contextMenuEvent(QContextMenuEvent *e)
從QWidget :: contextMenuEvent()重新實現。
[virtual slot] void QDialog::done(int r)
關閉對話框並將其結果代碼設置爲r。 如果使用exec()顯示此對話框,則done()將導致本地事件循環完成,而exec()將返回r。
與QWidget :: close()一樣,如果設置了Qt :: WA_DeleteOnClose標誌,done()將刪除該對話框。 如果對話框是應用程序的主窗口小部件,則應用程序將終止。 如果對話框是最後一個窗口關閉,則發出QApplication :: lastWindowClosed()信號。
[virtual protected] bool QDialog::event(QEvent *e)
從QObject :: event()重新實現。
[virtual protected] bool QDialog::eventFilter(QObject *o, QEvent *e)
從QObject :: eventFilter()重新實現。
[virtual slot] int QDialog::exec()
將對話框顯示爲模式對話框,阻止直到用戶關閉它。 該函數返回DialogCode結果。
如果對話框是應用程序模式,則用戶在關閉對話框之前無法與同一應用程序中的任何其他窗口進行交互。 如果對話框是窗口模式,則在對話框打開時僅阻止與父窗口的交互。 默認情況下,對話框是應用程序模式。
[signal] void QDialog::finished(int result)
當用戶或通過調用done(),accept()或reject()設置對話框的結果代碼時,將發出此信號。
請注意,使用hide()或setVisible(false)隱藏對話框時不會發出此信號。 這包括在對話框可見時刪除對話框。注意在使用hide()或setVisible(false)隱藏對話框時不會發出此信號。 這包括在對話框可見時刪除對話框。
該函數在Qt 4.1中引入。
[virtual protected] void QDialog::keyPressEvent(QKeyEvent *e)
從QWidget :: keyPressEvent()重新實現。
[virtual] QSize QDialog::minimumSizeHint() const
從QWidget :: minimumSizeHint()重新實現。
[virtual slot] void QDialog::open()
將對話框顯示爲窗口模式對話框,立即返回。
該函數在Qt 4.5中引入。
[virtual slot] void QDialog::reject()
隱藏模態對話框並將結果代碼設置爲已拒絕。
[signal] void QDialog::rejected()
當用戶拒絕對話框或使用QDialog :: Rejected參數調用reject()或done()時,將發出此信號。
請注意,使用hide()或setVisible(false)隱藏對話框時不會發出此信號。 這包括在對話框可見時刪除對話框。
該函數在Qt 4.1中引入。
[virtual protected] void QDialog::resizeEvent(QResizeEvent *)
從QWidget :: resizeEvent()重新實現。
通常返回模態對話框的結果代碼,Accepted或Rejected。
注意:在QMessageBox實例上調用時,返回的值是QMessageBox :: StandardButton枚舉的值。
如果對話框是使用Qt :: WA_DeleteOnClose屬性構造的,請不要調用此函數。
void QDialog::setResult(int i)
將模態對話框的結果代碼設置爲i。
注意:我們建議您使用QDialog :: DialogCode定義的值之一。
[virtual] void QDialog::setVisible(bool visible)
從QWidget :: setVisible()重新實現。
[virtual protected] void QDialog::showEvent(QShowEvent *event)
從QWidget :: showEvent()重新實現。
[virtual] QSize QDialog::sizeHint() const
從QWidget :: sizeHint()重新實現。