QDialog

详细描述

QDialog 类是对话框窗口的基类

一个对话框窗口是一个顶级窗口,主要用于短期任务以及与用户的简短通信。QDialog 可以是模态的或非模态的。QDialog 可以提供返回值,并且它们可以有默认按钮。QDialog 还可以在其右下角有一个QSizeGrip,使用setSizeGripEnabled()。

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

使用QWidget::setParent()函数的重载来更改QDialog小部件的所有权。此函数允许您显式设置重新父级化的小部件的窗口标志;使用重载函数将清除为小部件指定窗口系统属性的窗口标志(特别是它将重置Qt::Dialog标志)。

模态对话框

模态对话框是指在同一应用程序中阻止对其他可见窗口进行输入的对话框。用于向用户请求文件名或用于设置应用程序偏好的对话框通常是模态的。对话框可以是应用程序模态(默认)或窗口模态

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

显示模态对话框最常见的方式是调用其exec()函数。当用户关闭对话框时,exec()将提供一个有用的返回值。通常,为了使对话框关闭并返回适当的值,我们将默认按钮(例如“🆗”)连接到accept()槽函数,将“Cancel”按钮连接到reject()槽函数。或者,您可以使用AcceptedRejected调用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键功能实例代码

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 实现可扩展对话框。

扩展示例

扩展应用程序是一个对话框,允许用户进行简单搜索以及更高级的搜索。

简单搜索有两个选项:匹配大小写和从开头搜索。高级搜索选项包括搜索完整单词、向后搜索和搜索选定内容的可能性。应用程序启动时,只有简单搜索可见。高级搜索选项位于应用程序的扩展部分,可通过按下“更多”按钮使其可见:

FindDialog 类定义

FindDialog 类继承 QDialog 。QDialog 类是对话框窗口的基类。对话框窗口是一个顶级窗口,主要用于短期任务和与用户的简短交流。

class FindDialog : public QDialog
{
    Q_OBJECT

public:
    FindDialog(QWidget *parent = 0);

private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *fromStartCheckBox;
    QCheckBox *wholeWordsCheckBox;
    QCheckBox *searchSelectionCheckBox;
    QCheckBox *backwardCheckBox;
    QDialogButtonBox *buttonBox;
    QPushButton *findButton;
    QPushButton *moreButton;
    QWidget *extension;
};

FindDialog部件是主要的应用部件,并显示应用程序的搜索选项和控制按钮。

除了构造函数,声明了几个子部件:需要一个QLineEdit以及相关的QLabel,以便用户输入要搜索的单词,需要几个QCheckBox来方便搜索选项,并且需要三个QPushButton:用于启动搜索的“查找”按钮和用于启用高级搜索的“更多”按钮。最后,需要一个QWidget来表示应用程序的扩展部分。

FindDialog 类实现

在构造函数中,首先为简单搜索创建标准的子部件:带有相关QLabel的QLineEdit、两个QCheckBox和所有的QPushButton

FindDialog::FindDialog(QWidget *parent)
    : QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("Match &case"));
    fromStartCheckBox = new QCheckBox(tr("Search from &start"));
    fromStartCheckBox->setChecked(true);

    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);

    moreButton = new QPushButton(tr("&More"));
    moreButton->setCheckable(true);

 使用“&”字符为选项和按钮设置快捷键。在“查找内容”选项的情况下,还需要使用QLabel::setBuddy()函数以使快捷键按预期工作;然后,当用户按下标签指示的快捷键时,键盘焦点将转移到标签的伙伴小部件QLineEdit

 将“查找”按钮的默认属性设置为真,使用QPushButton::setDefault()函数。然后,如果用户按下回车键(或返回键),则该按钮将被按下。请注意,QDialog只能有一个默认按钮。

    extension = new QWidget;

    wholeWordsCheckBox = new QCheckBox(tr("&Whole words"));
    backwardCheckBox = new QCheckBox(tr("Search &backward"));
    searchSelectionCheckBox = new QCheckBox(tr("Search se&lection"));

然后创建扩展部件,以及与高级搜索选项相关联的QCheckBox。

    buttonBox = new QDialogButtonBox(Qt::Vertical);
    buttonBox->addButton(findButton, QDialogButtonBox::ActionRole);
    buttonBox->addButton(moreButton, QDialogButtonBox::ActionRole);

    connect(moreButton, &QAbstractButton::toggled, extension, &QWidget::setVisible);

    QVBoxLayout *extensionLayout = new QVBoxLayout;
    extensionLayout->setMargin(0);
    extensionLayout->addWidget(wholeWordsCheckBox);
    extensionLayout->addWidget(backwardCheckBox);
    extensionLayout->addWidget(searchSelectionCheckBox);
    extension->setLayout(extensionLayout);

 既然扩展部件已创建,可以将“更多”按钮的toggled()信号连接到扩展部件的setVisible()槽函数。每当可复选按钮更改其状态时,都会发出QAbstractButton::toggled()信号。如果按钮被选中,该信号的参数为真,否则为假。QWidget::setVisible()槽设置小部件的可见状态。如果状态为真,则显示小部件,否则隐藏小部件。

由于在创建“更多”按钮时将其设置为可勾选,因此该连接确保根据“更多”按钮的状态显示扩展小部件。

还将与高级搜索选项相关的复选框放入在扩展小部件上安装的布局中。

    QHBoxLayout *topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(fromStartCheckBox);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
    mainLayout->addLayout(leftLayout, 0, 0);
    mainLayout->addWidget(buttonBox, 0, 1);
    mainLayout->addWidget(extension, 1, 0, 1, 2);
    mainLayout->setRowStretch(2, 1);

    setLayout(mainLayout);

    setWindowTitle(tr("Extension"));

在创建主布局之前,为小部件创建几个子布局:首先,使用QHBoxLayout对齐QLabel及其伙伴QLineEdit。然后,使用QVBoxLayoutQLabelQLineEdit与简单搜索相关的复选框垂直对齐。为按钮创建QVBoxLayout。最后,使用QGridLayout布置后两个布局和扩展小部件。 

    extension->hide();
}

 最后,使用QWidget::hide()函数隐藏扩展部件,使应用程序在启动时仅显示简单的搜索选项。当用户想要访问高级搜索选项时,对话框只需更改扩展部件的可见性。Qt 的布局管理负责对话框的外观。

返回值(模态对话框)

模态对话框常用于需要返回值的情况,例如,用于指示用户是按下了“确定”还是“取消”。可以通过调用 接受() 或 拒绝() 槽来关闭对话框,并且 执行() 将相应地返回 Accepted 或 Rejected执行() 调用返回对话框的结果。如果对话框尚未销毁,结果也可以从 结果() 获得。

为了修改您的对话框的关闭行为,您可以重新实现函数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();
}

成员类型

enum QDialog::DialogCode 

模态对话框返回的值。

Constant Value 
QDialog::Accepted1
QDialog::Rejected0

属性

modal : bool 

此属性决定 显示() 应将对话框以模态还是非模态弹出

默认情况下,此属性为falseshow()以非模态弹出对话框。将此属性设置为 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 *oQEvent *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() 重新实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春意盎然的三月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值