c++ 如何防止在单击按钮后关闭QMessageBox

pftdvrlh  于 2023-01-03  发布在  其他
关注(0)|答案(5)|浏览(341)

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

vuv7lop3

vuv7lop31#

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

0aydgbwb2#

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

mctunoxg

mctunoxg3#

刚刚有同样的问题,但我想添加一个复选框,它不断关闭对话框点击,即使与ButtonRole设置为QMessageBox::ActionRole(也试过其他的)。对于这个场景,我只是在QCheckBox上调用了blockSignals(true),现在它允许在不关闭对话框的情况下进行选中/取消选中行为。幸运的是QCheckBox在没有信号的情况下工作正常,但假设你想从按钮上得到信号。
他们应该添加一个不会关闭对话框的新角色,因为为简单的自定义派生一个类是一件痛苦的事情。

83qze16e

83qze16e4#

我查看了addButton()函数重载,但是使用这个方法添加的按钮没有自定义行为,它们的行为就像messagebox上的标准按钮。
但是,如果您想创建一个完全可定制的对话框,那么最好的选择是扩展QDialog类,并在其上使用任何您喜欢的控件。

vd2z7a6w

vd2z7a6w5#

感谢@Albert 's Answer,我发现这在python中也是可能的:

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

相关问题