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!"); });
messagebox = QMessageBox()
button = QPushButton("This button will not close anything")
messagebox.addButton(button, QMessageBox.ButtonRole.NoRole)
button.disconnect()
5条答案
按热度按时间vuv7lop31#
一个有趣的方法是完全断开创建的目标按钮的信号,然后重新添加预期的功能。这并不适用于所有人,特别是如果按钮不是这样创建的和/或您仍然希望正确关闭对话框。(可能有一种方法可以将其添加回去和/或使用
QDialog::accept
、QDialog::reject
、QDialog::done
模拟行为-尚未尝试。)示例:
0aydgbwb2#
如果您可以获得指向
QMessageBox
小部件的指针,则可以尝试在其上安装一个QObject::eventFilter
来过滤QEvent::Close
。mctunoxg3#
刚刚有同样的问题,但我想添加一个复选框,它不断关闭对话框点击,即使与
ButtonRole
设置为QMessageBox::ActionRole
(也试过其他的)。对于这个场景,我只是在QCheckBox
上调用了blockSignals(true)
,现在它允许在不关闭对话框的情况下进行选中/取消选中行为。幸运的是QCheckBox
在没有信号的情况下工作正常,但假设你想从按钮上得到信号。他们应该添加一个不会关闭对话框的新角色,因为为简单的自定义派生一个类是一件痛苦的事情。
83qze16e4#
我查看了
addButton()
函数重载,但是使用这个方法添加的按钮没有自定义行为,它们的行为就像messagebox上的标准按钮。但是,如果您想创建一个完全可定制的对话框,那么最好的选择是扩展
QDialog
类,并在其上使用任何您喜欢的控件。vd2z7a6w5#
感谢@Albert 's Answer,我发现这在python中也是可能的: