我在QMessageBox上使用QMessageBox::addButton()方法添加了3个按钮。如果某个按钮被点击,有没有可能阻止消息框关闭?默认情况下,每个按钮都会关闭窗口,但我不想让其中一个按钮这样做。
QDialog::accept
、QDialog::reject
、QDialog::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!"); });
如果您可以获取到 QMessageBox
窗口的指针,您可以尝试在其上安装一个 QObject::eventFilter
,以过滤掉 QEvent::Close
事件。
ButtonRole
设置为 QMessageBox::ActionRole
(尝试了其他方式),点击后对话框始终会关闭。在这种情况下,我只需在 QCheckBox
上调用 blockSignals(true)
,就可以允许复选框的勾选/取消行为而不关闭对话框。幸运的是,QCheckBox
不会受到信号的影响,但我假设您希望从按钮中获得信号。我查看了 addButton()
函数的重载,但是对于使用该方法添加的按钮没有自定义行为。它们将像消息框上的标准按钮一样运作。
然而,如果您想创建一个完全可定制的对话框,那么最好的选择是扩展 QDialog
类并在其上使用您喜欢的任何控件。
感谢@Albert的回答,我发现这在Python中也是可能的:
messagebox = QMessageBox()
button = QPushButton("This button will not close anything")
messagebox.addButton(button, QMessageBox.ButtonRole.NoRole)
button.disconnect()