QDialog Class

QDialog 类是对话窗口的基类。更多

头文件: #include <QDialog>
CMake.QDialog 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 }

属性

公共函数

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()

信号

void accepted()
void finished(int result)
void rejected()

重新实现的受保护函数

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

详细说明

对话窗口是一种顶层窗口,主要用于短期任务和与用户的简短交流。QDialogs 可以是模态的,也可以是无模态的。QDialogs 可以提供return value ,也可以有default buttons 。QDialogs 的右下角还可以有一个QSizeGrip ,使用setSizeGripEnabled() 。

请注意,QDialog(以及任何其他具有Qt::Dialog 类型的 widget)使用父 widget 的方式与 Qt 中的其他类略有不同。对话框始终是顶层窗口部件,但如果它有父窗口部件,其默认位置将居中位于父窗口部件顶层窗口部件的顶部(如果它本身不是顶层窗口部件的话)。它还将共享父类的任务栏条目。

使用QWidget::setParent() 函数的重载来更改 QDialog widget 的所有权。通过该函数,您可以明确设置重新转属窗口部件的窗口标志;使用重载函数将清除指定窗口部件窗口系统属性的窗口标志(尤其是重置Qt::Dialog 标志)。

注意: 对话框的父窗口关系并意味着对话框将始终堆叠在父窗口的顶部。要确保对话框始终位于顶部,请将对话框设置为模态。这也适用于对话框本身的子窗口。要确保对话框的子窗口始终位于对话框的顶部,请将子窗口也设置为模式。

模式对话框是一种阻止同一应用程序中其他可见窗口输入的对话框。用于向用户请求文件名或用于设置应用程序首选项的对话框通常是模式对话框。对话框可以是application modal (默认)或window modal

打开应用程序模式对话框后,用户必须完成与对话框的交互并关闭对话框,才能访问应用程序中的任何其他窗口。窗口模式对话框只阻止访问与对话框相关联的窗口,允许用户继续使用应用程序中的其他窗口。

显示模式对话框的最常用方法是调用open() 函数。或者,也可以调用 setModal(true) 或setWindowModality() 函数,然后再调用show() 函数。在这两种情况下,一旦显示对话框,控件就会立即返回给调用者。您必须连接到finished() 信号,才能知道对话框何时关闭以及其return value 。或者,也可以连接accepted() 和rejected() 信号。

在执行自定义对话框时,为了关闭对话框并返回适当的值,请将默认按钮(例如确定按钮)连接到accept() 槽,将取消按钮连接到reject() 槽。另外,也可以使用AcceptedRejected 调用done() 槽。

如果显示模式对话框是为了执行长期运行的操作,建议在后台工作线程中执行该操作,这样就不会干扰图形用户界面线程。

警告: 使用open() 或show() 时,不应在堆栈中创建模式对话框,以免控件返回调用者后立即将其销毁。

注: 有一种方法可以通过调用exec() 在阻塞模式下显示模式对话框。在这种情况下,只有当对话框关闭时,控件才会返回 GUI 线程。不过,这种方法并不可取,因为它会创建嵌套事件循环,而某些平台并不完全支持嵌套事件循环。

无模型对话框

无模式对话框是一种独立于同一应用程序中其他窗口运行的对话框。文字处理程序中的查找和替换对话框通常是无模式的,这样用户就可以同时与应用程序的主窗口和对话框进行交互。

无模式对话框使用show() 显示,它会立即将控制权返回给调用者。

如果在隐藏对话框后调用show() 函数,对话框将显示在原来的位置。这是因为窗口管理器会决定程序员未明确放置的窗口的位置。要保留被用户移动过的对话框的位置,请在closeEvent() 处理程序中保存其位置,然后将对话框移动到该位置,然后再显示对话框。

默认按钮

对话框的默认按钮是用户按 Enter(返回)键时按下的按钮。该按钮用于表示用户接受对话框的设置并希望关闭对话框。使用QPushButton::setDefault(),QPushButton::isDefault() 和QPushButton::autoDefault() 可以设置和控制对话框的默认按钮。

Escape 键

如果用户在对话框中按 Esc 键,将调用QDialog::reject()。这将导致窗口关闭:close event 不能被ignored

可扩展性

可扩展性是以两种方式显示对话框的能力:显示最常用选项的部分对话框和显示所有选项的完整对话框。通常情况下,可扩展对话框最初显示为部分对话框,但带有一个More 切换按钮。如果用户按下More 按钮,对话框就会展开。

返回值(模态对话框)

模态对话框常用于需要返回值的情况,例如,显示用户按下的是OK 还是Cancel 。可以通过调用accept() 或reject() 槽关闭对话框,exec() 将根据情况返回AcceptedRejected 。调用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标准对话框示例

成员类型文档

enum QDialog::DialogCode

模式对话框返回的值。

常量
QDialog::Accepted1
QDialog::Rejected0

属性文档

该属性用于确定show() 应弹出模式对话框还是无模式对话框。

默认情况下,该属性为falseshow() 会以无模式方式弹出对话框。将此属性设置为 true 相当于将QWidget::windowModality 设置为Qt::ApplicationModal

exec() 会忽略此属性的值,并始终以模态方式弹出对话框。

访问函数:

bool isModal() const
void setModal(bool modal)

另请参阅 QWidget::windowModalityshow() 和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

另请参阅 reject() 和done()。

[signal] void QDialog::accepted()

当用户接受对话框或调用accept() 或done() 并使用QDialog::Accepted 参数接受对话框时,将发出此信号。

请注意,使用hide() 或setVisible(false) 隐藏对话框时不会发出此信号。这包括在对话框可见时将其删除。

另请参阅 finished() 和rejected()。

[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)

关闭对话框并将其结果代码设为rfinished() 信号将发出r ;如果rQDialog::AcceptedQDialog::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() 时,您可以连接到QDialogfinished() 信号,以便在关闭对话框时收到通知。

另请参见 open()、show()、result() 和setWindowModality()。

[signal] void QDialog::finished(int result)

当用户或通过调用done() 、accept() 或reject() 设置了对话框的result 代码时,将发出此信号。

请注意,使用hide() 或setVisible(false) 隐藏对话框时不会发出此信号。这包括在对话框可见时将其删除。

另请参阅 accepted() 和rejected()。

[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

另请参阅 accept() 和done()。

[signal] void QDialog::rejected()

当用户或调用reject() 或带有QDialog::Rejected 参数的done() 拒绝对话框时,将发出此信号。

请注意,使用hide() 或setVisible(false) 隐藏对话框时不会发出此信号。这包括在对话框可见时将其删除。

另请参阅 finished() 和accepted()。

[override virtual protected] void QDialog::resizeEvent(QResizeEvent *)

重实现:QWidget::resizeEvent(QResizeEvent *event).

int QDialog::result() const

一般情况下,返回模式对话框的结果代码AcceptedRejected

注: 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

© 2025 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.