详细描述
QDialog 类是对话框窗口的基类
一个对话框窗口是一个顶级窗口,主要用于短期任务以及与用户的简短通信。QDialog 可以是模态的或非模态的。QDialog 可以提供返回值,并且它们可以有默认按钮。QDialog 还可以在其右下角有一个QSizeGrip,使用setSizeGripEnabled()。
请注意,QDialog(以及任何其他具有Qt::Dialog
类型的小部件)在使用父部件方面与 Qt 中的其他类略有不同。对话框始终是顶级小部件,但如果它有父部件,其默认位置将在父部件的顶级小部件之上居中(如果其本身不是顶级的)。它还将共享父部件的任务栏条目。
使用QWidget::setParent()函数的重载来更改QDialog小部件的所有权。此函数允许您显式设置重新父级化的小部件的窗口标志;使用重载函数将清除为小部件指定窗口系统属性的窗口标志(特别是它将重置Qt::Dialog标志)。
模态对话框
模态对话框是指在同一应用程序中阻止对其他可见窗口进行输入的对话框。用于向用户请求文件名或用于设置应用程序偏好的对话框通常是模态的。对话框可以是应用程序模态(默认)或窗口模态。
当应用程序模态对话框打开时,用户必须完成与该对话框的交互并关闭它,然后才能访问应用程序中的任何其他窗口。窗口模态对话框仅阻止访问与该对话框相关联的窗口,允许用户继续使用应用程序中的其他窗口。
显示模态对话框最常见的方式是调用其exec()函数。当用户关闭对话框时,exec()将提供一个有用的返回值。通常,为了使对话框关闭并返回适当的值,我们将默认按钮(例如"🆗")连接到accept()槽函数,将"Cancel"按钮连接到reject()槽函数。或者,您可以使用Accepted
或Rejected
调用done()槽函数。
另一种选择是调用setModal(true) 或 setWindowModality(),然后show()。与exec()不同,show()会立即将控制权返回给调用者。调用setModal(true)对于进度对话框特别有用,在这种情况下,用户必须能够与对话框进行交互,例如取消长时间运行的操作。如果您一起使用show()和setModal(true)来执行长时间操作,则在处理过程中必须定期调用QApplication::processEvents(),以使用户能够与对话框进行交互。(请参阅QProgressDialog。)
非模态对话框
无模式对话框是一种在同一应用程序中独立于其他窗口运行的对话框。在文字处理器中,查找和替换对话框通常是无模式的,以便用户能够与应用程序的主窗口和对话框进行交互。
无模式对话框使用show() 显示,它会立即将控制权返回给调用者。
如果在隐藏对话框后调用 show() 函数,对话框将显示在其原始位置。这是因为窗口管理器会为程序员未明确放置的窗口决定位置。为了保留用户移动过的对话框的位置,请在 closeEvent() 处理程序中保存其位置,然后在再次显示之前将对话框移动到该位置。
默认按钮
对话框的默认按钮是当用户按下回车键(Return)时被按下的按钮。此按钮用于表示用户接受对话框的设置并希望关闭对话框。使用QPushButton::setDefault()、QPushButton::isDefault() 和 QPushButton::autoDefault() 来设置和控制对话框的默认按钮。
Esc 键
如果用户在对话框中按下 Esc 键,QDialog::reject() 将被调用。这将导致窗口关闭:关闭事件不能被忽略。
取消↩︎、Esc键功能实例代码
cpp
void Dlg::keyPressEvent(QKeyEvent *e)
{
if (!e->modifiers() || (e->modifiers() & Qt::KeypadModifier && e->key() == Qt::Key_Enter))
{
switch (e->key())
{
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Escape:
e->ignore();
break;
default:
e->ignore();
return;
}
}
else
{
this->keyPressEvent(e);
}
}
可扩展性
可扩展性是指能够以两种方式显示对话框:一种是显示最常用选项的部分对话框,另一种是显示所有选项的完整对话框。通常,可扩展对话框最初会以部分对话框的形式出现,但带有"更多"切换按钮。如果用户按下"更多"按钮,对话框就会展开。扩展示例展示了如何使用 Qt 实现可扩展对话框。
返回值(模态对话框)
模态对话框常用于需要返回值的情况,例如,用于指示用户是按下了"确定"还是"取消"。可以通过调用 接受() 或 拒绝() 槽来关闭对话框,并且 执行() 将相应地返回 Accepted
或 Rejected
。执行() 调用返回对话框的结果。如果对话框尚未销毁,结果也可以从 结果() 获得。
为了修改您的对话框的关闭行为,您可以重新实现函数accept()、reject() 或 done()。closeEvent() 函数仅应重新实现以保留对话框的位置或覆盖标准的关闭或拒绝行为。
代码示例
一个模态对话框:
cpp
void EditorWindow::countWords()
{
WordCountDialog dialog(this);
dialog.setWordCount(document().wordCount());
dialog.exec();
}
一个非模式对话框:
cpp
void EditorWindow::find()
{
if (!findDialog) {
findDialog = new FindDialog(this);
connect(findDialog, SIGNAL(findNext()), this, SLOT(findNext()));
}
findDialog->show();
findDialog->raise();
findDialog->activateWindow();
}
成员类型
enum QDialog::DialogCode
模态对话框返回的值。
Constant | Value |
---|---|
QDialog::Accepted |
1 |
QDialog::Rejected |
0 |
属性
modal : bool
此属性决定 显示() 应将对话框以模态还是非模态弹出
默认情况下,此属性为false
且show()以非模态弹出对话框。将此属性设置为 true 相当于将QWidget::windowModality设置为Qt::ApplicationModal。
exec() 忽略此属性的值并且总是以模态弹出对话框。
访问函数
|------|--------------------------------------------------------------------------------------------|
| bool | isModal() const |
| void | setModal (bool modal) |
sizeGripEnabled : bool
此属性表示大小调整手柄是否启用
当此属性启用时,一个QSizeGrip会被放置在对话框的右下角。默认情况下,尺寸控制柄是禁用的。
访问函数:
|------|---------------------------------|
| bool | isSizeGripEnabled() const |
| void | setSizeGripEnabled (bool) |
成员函数
QDialog::QDialog(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
与父级 parent 构建一个对话框。
对话框始终是顶级窗口小部件,但如果它有父窗口,其默认位置位于父窗口顶部的中心。它还将共享父窗口的任务栏条目。
小部件标志 f 被传递给 QWidget 构造函数。例如,如果您不希望对话框标题栏中有"这是什么"按钮,请在 f 中传递 Qt::WindowTitleHint | Qt::WindowSystemMenuHint 。
QDialog::~QDialog()
销毁QDialog,删除其所有子项。
void QDialog::accept() [virtual slot]
隐藏模态对话框并将结果代码设置为Accepted
。
void QDialog::accepted() [signal]
当对话框已被用户接受,或者通过调用accept() 或 done() 并使用QDialog::Accepted 参数时,会发出此信号。
请注意,当使用hide() 或 setVisible(false) 隐藏对话框时,此信号不会发出。这包括在对话框可见时删除它。
此函数在 Qt 4.1 中引入。
void QDialog::closeEvent(QCloseEvent *e) [virtual protected]
从QWidget::closeEvent() 重新实现。
void QDialog::contextMenuEvent(QContextMenuEvent *e) [virtual protected]
从QWidget::contextMenuEvent() 重新实现。
void QDialog::done(int r) [virtual slot]
关闭对话框并将其结果代码设置为 r 。如果此对话框通过 exec() 显示,done() 会导致本地事件循环结束,并且 exec() 返回 r 。
与QWidget::close() 一样,如果设置了Qt::WA_DeleteOnClose标志,done() 会删除对话框。如果该对话框是应用程序的主窗口,应用程序将终止。如果该对话框是最后关闭的窗口,则会发出QApplication::lastWindowClosed() 信号。
bool QDialog::event(QEvent *e) [virtual protected]
从QObject::event() 重新实现。
bool QDialog::eventFilter(QObject *o , QEvent *e) [virtual protected]
从QObject::eventFilter() 重新实现。
int QDialog::exec() [virtual slot]
显示该对话框为模态对话框,阻塞直至用户关闭它。该函数返回一个对话框代码结果。
如果对话框是应用程序模态,则在用户关闭对话框之前,他们无法与同一应用程序中的任何其他窗口进行交互。如果对话框是窗口模态,则在对话框打开时,仅与父窗口的交互被阻止。默认情况下,对话框是应用程序模态。
void QDialog::finished(int result) [signal]
当对话框的结果代码已被设置时,此信号会发出,无论是由用户设置,还是通过调用完成()、接受() 或 拒绝() 进行设置。
请注意,当使用hide() 或 setVisible(false) 隐藏对话框时,此信号不会发出。这包括在对话框可见时删除它。
此函数在 Qt 4.1 中引入。
void QDialog::keyPressEvent(QKeyEvent *e) [virtual protected]
从QWidget::keyPressEvent() 重新实现。
QSize QDialog::minimumSizeHint() const [virtual]
重新实现自QWidget::minimumSizeHint() 。
void QDialog::open() [virtual slot]
将对话框显示为窗口模态对话框,立即返回。
此函数在 Qt 4.5 中引入。
void QDialog::reject() [virtual slot]
隐藏模态对话框,并将结果代码设置为Rejected
。
void QDialog::rejected() [signal]
当对话框被用户拒绝,或者通过调用reject() 或done() 并使用QDialog::Rejected 参数拒绝时,会发出此信号。
请注意,当使用hide() 或 setVisible(false) 隐藏对话框时,此信号不会发出。这包括在对话框可见时删除它。
此函数在 Qt 4.1 中引入。
void QDialog::resizeEvent(QResizeEvent *) [virtual protected]
从QWidget::resizeEvent() 重新实现。
int QDialog::result() const
一般来说,返回模态对话框的结果代码,Accepted
或 Rejected
。
注意:当在 QMessageBox 实例上调用时,返回的值是 QMessageBox::StandardButton 枚举的值。
如果对话框是使用Qt::WA_DeleteOnClose属性构建的,则不要调用此函数。
void QDialog::setResult(int i)
将模态对话框的结果代码设置为 i 。
注意:我们建议您使用QDialog::DialogCode定义的其中一个值。
void QDialog::setVisible(bool visible) [virtual]
从QWidget::setVisible() 重新实现。
void QDialog::showEvent(QShowEvent *event) [virtual protected]
从QWidget::showEvent() 重新实现。
QSize QDialog::sizeHint() const [virtual]
从QWidget::sizeHint() 重新实现。