QDialog Class
QDialog 类是对话框窗口的基类。更多内容...
| 头文件: | #include <QDialog> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 继承自: | QWidget |
| 被继承者: | QColorDialog、QErrorMessage 、QFileDialog 、QFontDialog 、QInputDialog 、QMessageBox 、QProgressDialog ,以及QWizard |
公共类型
| enum | DialogCode { Accepted, Rejected } |
属性
- modal : bool
- sizeGripEnabled : bool
公共函数
| QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()) | |
| virtual | ~QDialog() |
| bool | isSizeGripEnabled() const |
| int | result() const |
| void | setModal(bool modal) |
| void | setResult(int i) |
| void | setSizeGripEnabled(bool) |
重新实现的公共函数
| virtual QSize | minimumSizeHint() const override |
| virtual void | setVisible(bool visible) override |
| virtual QSize | sizeHint() const override |
公共插槽
| virtual void | accept() |
| virtual void | done(int r) |
| virtual int | exec() |
| virtual void | open() |
| virtual void | reject() |
信号
重新实现的受保护函数
| virtual void | closeEvent(QCloseEvent *e) override |
| virtual void | contextMenuEvent(QContextMenuEvent *e) override |
| virtual bool | eventFilter(QObject *o, QEvent *e) override |
| virtual void | keyPressEvent(QKeyEvent *e) override |
| virtual void | resizeEvent(QResizeEvent *) override |
| virtual void | showEvent(QShowEvent *event) override |
详细说明
对话框是一种顶级窗口,主要用于短期任务以及与用户的简短交互。QDialog 可以是模态的,也可以是非模态的。QDialog 可以提供return value ,并可包含default buttons 。QDialog 还可以在其右下角显示QSizeGrip ,使用setSizeGripEnabled() 实现。
请注意,QDialog(以及任何其他类型为Qt::Dialog 的小部件)使用父小部件的方式与 Qt 中的其他类略有不同。对话框始终是顶级小部件,但如果它有父小部件,则其默认位置是居中显示在父小部件的顶级小部件之上(如果对话框本身不是顶级小部件的话)。 它还将与父控件共享任务栏条目。
请使用QWidget::setParent()函数的重载版本来更改QDialog控件的所有权。该函数允许您显式设置重新设置父控件后的控件的窗口标志;使用重载函数将清除指定控件窗口系统属性的窗口标志(特别是会重置Qt::Dialog 标志)。
注意: 对话框的父子关系 并不意味着该对话框会始终位于父窗口之上。若要确保对话框始终处于最上方,请将其设为模态。这一点也适用于对话框本身的子窗口。若要确保对话框的子窗口始终位于对话框之上,请同样将子窗口设为模态。
模态对话框
模态对话框是一种会阻止同一应用程序中其他可见窗口接收输入的对话框。用于向用户请求文件名或设置应用程序首选项的对话框通常是模态的。对话框可以是application modal (默认)或window modal 。
当应用程序的模态对话框打开时,用户必须先完成与该对话框的交互并将其关闭,才能访问应用程序中的任何其他窗口。窗口模态对话框仅阻止对与该对话框关联的窗口的访问,允许用户继续使用应用程序中的其他窗口。
显示模态对话框最常见的方法是调用其open()函数。此外,您还可以调用setModal(true)或setWindowModality(),随后调用show()。无论采用哪种方式,一旦对话框显示出来,控制权会立即返回给调用方。 您必须连接到finished()信号,才能知道对话框何时关闭以及其return value 值是多少。此外,您还可以连接到accepted()和rejected()信号。
在实现自定义对话框时,若要关闭对话框并返回适当的值,请将默认按钮(例如“确定”按钮)连接到accept()槽,并将“取消”按钮连接到reject()槽。或者,您也可以通过Accepted 或Rejected 调用done()槽。
如果显示模态对话框以执行耗时较长的操作,建议在后台工作线程中执行该操作,以免干扰GUI线程。
注意:可以通过 调用exec()以阻塞模式显示模态对话框。在这种情况下,控件仅在对话框关闭时才会 返回GUI线程。但是,不建议采用这种方法,因为它会创建一个嵌套的事件循环,而某些平台并不完全支持这种机制。
非模态对话框
非模态对话框是指能够独立于同一应用程序中的其他窗口运行的对话框。文字处理软件中的“查找和替换”对话框通常采用非模态模式,以便用户能够同时与应用程序的主窗口和对话框进行交互。
非模态对话框通过show() 函数显示,该函数会立即将控制权交还给调用方。
如果在隐藏对话框后调用show()函数,该对话框将显示在其原始位置。这是因为对于未被程序员显式定位的窗口,其位置由窗口管理器决定。 若要保留用户已移动的对话框的位置,请在closeEvent()处理程序中保存其位置,然后在再次显示对话框之前将其移动到该位置。
默认按钮
对话框的默认按钮是指用户按下 Enter(Return)键时被选中的按钮。该按钮用于表示用户接受对话框的设置并希望关闭对话框。请使用QPushButton::setDefault()、QPushButton::isDefault() 和QPushButton::autoDefault() 来设置和控制对话框的默认按钮。
Esc键
如果用户在对话框中按下 Esc 键,将调用QDialog::reject()。这将导致窗口关闭:close event 不能设置为ignored 。
可扩展性
可扩展性是指以两种方式显示对话框的能力:一种是显示最常用选项的“部分对话框”,另一种是显示所有选项的“完整对话框”。通常,可扩展对话框初始时会以“部分对话框”的形式出现,但会带有More 切换按钮。如果用户按下More 按钮,对话框将展开。
返回值(模态对话框)
模态对话框常用于需要返回值的情境,例如用于指示用户是否点击了OK 或Cancel 。可通过调用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, &FindDialog::findNext,
this, &EditorWindow::findNext);
}
findDialog->show();
findDialog->raise();
findDialog->activateWindow();
}带扩展的对话框:
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
findButton = new QPushButton(tr("&Find"));
moreButton = new QPushButton(tr("&More..."));
moreButton->setCheckable(true);
extension = new ExtendedControls;
mainLayout->addWidget(extension);
extension->hide();
connect(moreButton, &QAbstractButton::toggled, extension, &QWidget::setVisible);通过将对话框布局的sizeConstraint 属性设置为SetFixedSize ,用户将无法调整对话框大小,且当扩展被隐藏时,对话框会自动缩小。
另请参阅 QDialogButtonBox 、QTabWidget 、QWidget 、QProgressDialog 以及“标准对话框示例”。
属性文档
modal : bool
该属性决定show() 调用时,对话框应以模态方式还是非模态方式弹出
默认情况下,该属性值为false ,而show()会以非模态方式弹出对话框。将该属性设置为true,相当于将QWidget::windowModality 设置为Qt::ApplicationModal 。
exec() 会忽略该属性的值,并始终以模态方式弹出对话框。
访问函数:
| bool | isModal() const |
| void | setModal(bool modal) |
另请参阅 QWidget::windowModality 、show() 和exec()。
sizeGripEnabled : bool
该属性用于控制尺寸控制点是否启用
启用此属性时,对话框的右下角会显示一个QSizeGrip 控件。默认情况下,大小控点处于禁用状态。
访问函数:
| bool | isSizeGripEnabled() const |
| void | setSizeGripEnabled(bool) |
成员函数文档
[explicit] QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
创建一个父窗口为parent 的对话框。
对话框始终是顶级控件,但如果它有父控件,则其默认位置会居中显示在父控件上方。它还将与父控件共享任务栏条目。
对话框的控件标志f 将传递给QWidget 构造函数。例如,若不希望在对话框的标题栏中显示“这是什么”按钮,请在f 中传入Qt::WindowTitleHint |Qt::WindowSystemMenuHint 。
另请参阅 QWidget::setWindowFlags()。
[virtual noexcept] QDialog::~QDialog()
销毁QDialog ,并删除其所有子节点。
[virtual slot] void QDialog::accept()
隐藏模态对话框,并将结果代码设置为Accepted 。
[signal] void QDialog::accepted()
当对话框被用户接受,或者通过调用accept()或done()并传入QDialog::Accepted 参数时,会发出此信号。
请注意,当使用hide() 或setVisible(false) 隐藏对话框时,不会发出此信号。这包括在对话框可见时将其删除的情况。
[override virtual protected] void QDialog::closeEvent(QCloseEvent *e)
重写了:QWidget::closeEvent(QCloseEvent *event)。
[override virtual protected] void QDialog::contextMenuEvent(QContextMenuEvent *e)
重写了:QWidget::contextMenuEvent(QContextMenuEvent *event)。
[virtual slot] void QDialog::done(int r)
关闭对话框,并将结果代码设置为r 。finished()信号将发出r ;如果r 为QDialog::Accepted 或QDialog::Rejected ,则分别还会发出accepted()或rejected()信号。
如果该对话框是通过 `exec()` 显示的,则 `done()` 还会导致本地事件循环结束,并且 `exec()` 会返回 `r`。
与QWidget::close()类似,如果设置了Qt::WA_DeleteOnClose 标志,done()会删除该对话框。如果该对话框是应用程序的主控件,则应用程序终止。如果该对话框是最后关闭的窗口,则会发出QGuiApplication::lastWindowClosed()信号。
另请参阅 accept()、reject()、QApplication::activeWindow() 以及QCoreApplication::quit()。
[override virtual protected] bool QDialog::eventFilter(QObject *o, QEvent *e)
重写了:QObject::eventFilter(QObject *watched, QEvent *event)。
[virtual slot] int QDialog::exec()
将对话框显示为modal dialog ,并阻塞程序直至用户关闭该对话框。该函数返回DialogCode 结果。
如果对话框为application modal ,则用户在关闭对话框之前无法与同一应用程序中的任何其他窗口进行交互。如果对话框为window modal ,则在对话框打开期间,仅阻止与父窗口的交互。默认情况下,对话框为应用程序模态。
注意:请避免 使用此函数;建议改用 `open()`。与 `exec()` 不同,`open()` 是异步的,且不会启动额外的事件循环。这可以防止一系列危险的错误发生(例如,通过 `exec()` 在对话框打开时删除其父窗口)。 使用open() 时,您可以监听QDialog 的finished() 信号,以便在对话框关闭时收到通知。
另请参阅 open()、show()、result() 和setWindowModality()。
[signal] void QDialog::finished(int result)
当对话框的result 属性被设置时(无论是用户设置的,还是通过调用done()、accept()或reject()设置的),都会触发此信号。
请注意,当使用hide()或setVisible(false)隐藏对话框时,不会发出此信号。这包括在对话框可见时将其删除的情况。
[override virtual protected] void QDialog::keyPressEvent(QKeyEvent *e)
重写了:QWidget::keyPressEvent(QKeyEvent *event)。
[override virtual] QSize QDialog::minimumSizeHint() const
重新实现了属性QWidget::minimumSizeHint 的访问函数。
[virtual slot] void QDialog::open()
以window modal dialog 的形式显示对话框,并立即返回。
另请参阅 exec()、show()、result() 以及setWindowModality()。
[virtual slot] void QDialog::reject()
隐藏模态对话框,并将结果代码设置为Rejected 。
[signal] void QDialog::rejected()
当对话框被用户关闭,或者通过调用reject()或done()并传入QDialog::Rejected 参数时,会触发此信号。
请注意,当使用hide() 或setVisible(false) 隐藏对话框时,不会发出此信号。这包括在对话框可见时将其删除的情况。
[override virtual protected] void QDialog::resizeEvent(QResizeEvent *)
重写了:QWidget::resizeEvent(QResizeEvent *event)。
int QDialog::result() const
通常返回模态对话框的结果代码,即Accepted 或Rejected 。
注意:当 在QMessageBox 实例上调用此函数时 ,返回值是QMessageBox::StandardButton 枚举中的一个值。
如果对话框是在Qt::WA_DeleteOnClose 属性下创建的,请勿调用此函数。
另请参阅 setResult()。
void QDialog::setResult(int i)
将模态对话框的结果代码设置为i 。
注意:建议 使用 `QDialog::DialogCode` 中定义的值之一。
另请参阅 result()。
[override virtual] void QDialog::setVisible(bool visible)
重新实现了属性QWidget::visible 的访问函数。
[override virtual protected] void QDialog::showEvent(QShowEvent *event)
重写了:QWidget::showEvent(QShowEvent *event)。
[override virtual] QSize QDialog::sizeHint() const
重新实现了属性QWidget::sizeHint 的访问函数。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.