【问题标题】:How to prevent closing QMessageBox after clicking a button单击按钮后如何防止关闭QMessageBox
【发布时间】:2012-09-01 19:13:01
【问题描述】:

我在 QMessageBox 上通过 QMessageBox::addButton() 方法添加了 3 个按钮。如果单击按钮,是否可以防止关闭消息框?默认情况下,每个按钮都会关闭窗口,但我不想为一个按钮这样做。

编辑: 为什么这被否决了?

【问题讨论】:

  • 您可能需要使用 QDialog 创建自己的消息框
  • 我已经做了,只是想知道是否可以。

标签: c++ qt


【解决方案1】:

一种对我有用的有趣方法是完全断开创建的目标按钮的信号,然后重新添加预期的功能。这不适用于所有人,特别是如果按钮不是以这种方式创建的和/或您仍想正确关闭对话框。 (可能有办法将其添加回来和/或使用QDialog::acceptQDialog::rejectQDialog::done 模拟行为 - 尚未尝试。)

例子:

QMessageBox *msgBox = new QMessageBox(this);
QAbstractButton *doNotCloseButton = msgBox->addButton(tr("This button will not close anything"), QMessageBox::ActionRole);
// Disconnect all events - this will prevent the button from closing the dialog
doNotCloseButton->disconnect();
connect(doNotCloseButton, &QAbstractButton::clicked, this, [=](){ doNotCloseButton->setText("See? Still open!"); });

【讨论】:

    【解决方案2】:

    如果您可以获得指向QMessageBox 小部件的指针,您可以尝试在其上安装QObject::eventFilter 以过滤QEvent::Close

    【讨论】:

      【解决方案3】:

      刚遇到同样的问题,但我想添加一个复选框,即使将ButtonRole 设置为QMessageBox::ActionRole(也尝试过其他人),它也会在单击时关闭对话框。对于这种情况,我刚刚在QCheckBox 上调用了blockSignals(true),现在它允许在不关闭对话框的情况下检查/取消选中行为。幸运的是,QCheckBox 在没有信号的情况下也能正常工作,但假设您希望按钮发出信号。

      他们可能应该添加一个不会关闭对话框的新角色,因为为简单的自定义派生一个类很麻烦。

      【讨论】:

        【解决方案4】:

        我查看了addButton() 函数重载,但您使用此方法添加的按钮没有自定义行为。它们的行为类似于消息框上的标准按钮。

        但是,如果您想创建一个完全可自定义的对话框,那么您最好的选择是扩展 QDialog 类并在其上使用您喜欢的任何控件。

        【讨论】:

          猜你喜欢
          • 2012-11-24
          • 1970-01-01
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多