如何防止在点击按钮后关闭QMessageBox?

7

我在QMessageBox上使用QMessageBox::addButton()方法添加了3个按钮。如果某个按钮被点击,有没有可能阻止消息框关闭?默认情况下,每个按钮都会关闭窗口,但我不想让其中一个按钮这样做。


1
您可能需要使用QDialog创建自己的消息框。 - Mr.Anubis
我已经完成了,但我只是想知道是否可能。 - tobi
5个回答

5
一种我觉得很有趣的方法是先完全断开目标按钮的信号,然后重新添加预期的功能。这个方法不适用于所有人,特别是如果按钮不是以这种方式创建的,或者您仍然想正确关闭对话框。 (可能有一种方法可以将其添加回来和/或使用 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!"); });

3

如果您可以获取到 QMessageBox 窗口的指针,您可以尝试在其上安装一个 QObject::eventFilter,以过滤掉 QEvent::Close 事件。


3
我之前遇到了同样的问题,但我想添加一个复选框(checkbox),即使将 ButtonRole 设置为 QMessageBox::ActionRole (尝试了其他方式),点击后对话框始终会关闭。在这种情况下,我只需在 QCheckBox 上调用 blockSignals(true),就可以允许复选框的勾选/取消行为而不关闭对话框。幸运的是,QCheckBox 不会受到信号的影响,但我假设您希望从按钮中获得信号。
他们应该添加一个新的角色,它不会关闭对话框,因为为了进行简单的自定义而派生类是很麻烦的。

1

我查看了 addButton() 函数的重载,但是对于使用该方法添加的按钮没有自定义行为。它们将像消息框上的标准按钮一样运作。

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


0

感谢@Albert的回答,我发现这在Python中也是可能的:

messagebox = QMessageBox()
button = QPushButton("This button will not close anything")
messagebox.addButton(button, QMessageBox.ButtonRole.NoRole)
button.disconnect()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接