如何要求密码才能关闭窗口?

Posted

技术标签:

【中文标题】如何要求密码才能关闭窗口?【英文标题】:How to require a password to close a window? 【发布时间】:2018-09-12 09:45:07 【问题描述】:

我想保护一个窗口不被关闭,所以当用户尝试这样做时,必须输入密码才能完成操作。无需输入用户名。

我知道如何拦截QWidget::closeEvent,如下例:

void MainWindow::closeEvent(QCloseEvent *event) 
    QMessageBox msgBox;
    msgBox.setText(tr("Do you want to close the window?"));
    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msgBox.setDefaultButton(QMessageBox::No);
    msgBox.setModal(true);
    int ret = msgBox.exec();
    if (ret == QMessageBox::Yes)
        event->accept();
    else
        event->ignore();

问题是,该示例使用QMessageBox,它不允许输入文本,因此不适合我的需要。

如何修改代码以提示输入密码?

【问题讨论】:

不能用QMessageBox,它只支持yes/no/cancel等。看QInputDialog,用textEchoMode隐藏密码 成功了!!谢谢@YSC @Minikornio,我可以请您将答案标记为已接受。 【参考方案1】:

解决方案

使用QDialog 代替QMessageBox 并根据您的需要进行调整。

示例

这是我为您准备的一个示例,用于演示如何实施建议的解决方案:

void MainWindow::closeEvent(QCloseEvent *event) 
    QDialog dialog(this);
    auto *layoutDialog = new QVBoxLayout(&dialog);
    auto *lineEdit = new QLineEdit(&dialog);
    auto *label = new QLabel(tr("Enter password to close the window:"), &dialog);

    lineEdit->setEchoMode(QLineEdit::Password);

    layoutDialog->addWidget(label);
    layoutDialog->addWidget(lineEdit);
    layoutDialog->addStretch();

    connect(lineEdit, &QLineEdit::editingFinished, [&]() 
        dialog.done(lineEdit->text() == "11223344");
    );

    dialog.resize(250, 100);

    if (dialog.exec())
        event->accept();
    else
        event->ignore();

注意:当然你必须想出一个更聪明的方法来保证密码的安全。

【讨论】:

以上是关于如何要求密码才能关闭窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制关闭顶层窗口的消息框

.NET中开发WinForm程序,如何通过一个窗口打开另外一个窗口,要求上一窗口关闭

用JavaScript打开一个新窗口并关闭前一个[重复]

如果窗口关闭,如何不显示图像?

Java登录窗口关闭 打开新窗口

VC++如何实现 弹出窗口,然后等窗口关闭后再执行剩下的代码?