由于其性质,QMessageBox 不应该允许调整大小。如果需要调整大小,应该使用 QDialog。
话虽如此,固定大小的限制是由内部布局引起的,该布局在对话框的相关方面发生更改时(按钮、[取消]设置详细文本等)也会被替换。
由于布局管理完全是内部的,并且它总是重置对话框的固定大小,解决方法是监视相关事件,特别是 LayoutRequest(每当需要重新布局时调用)和 Resize,并覆盖最大大小。
使用子类的解决方案非常简单。
class ResizableMessageBox(QtWidgets.QMessageBox):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setSizeGripEnabled(True)
def event(self, event):
if event.type() in (event.LayoutRequest, event.Resize):
if event.type() == event.Resize:
res = super().event(event)
else:
res = False
details = self.findChild(QtWidgets.QTextEdit)
if details:
details.setMaximumSize(16777215, 16777215)
self.setMaximumSize(16777215, 16777215)
return res
return super().event(event)
或者,使用事件过滤器:
class Something(QWidget):
def showMessageBox(self):
mb = QtWidgets.QMessageBox()
mb.setSizeGripEnabled(True)
mb.setWindowTitle('Hello')
mb.setText('I am a message box')
mb.setDetailedText('very long text ' * 10)
mb.setProperty('resizable', True)
mb.installEventFilter(self)
mb.exec()
def eventFilter(self, obj, event):
if (isinstance(obj, QtWidgets.QMessageBox)
and obj.property('resizable')
and event.type() in (event.LayoutRequest, event.Resize)):
if event.type() == event.Resize:
obj.event(event)
details = obj.findChild(QtWidgets.QTextEdit)
if details:
details.setMaximumSize(16777215, 16777215)
obj.setMaximumSize(16777215, 16777215)
return True
return super().eventFilter(obj, event)
注意:上述方法都不能与QMessageBox的静态方法一起使用,因为它们创建了一个私有实例。
QMessageBox
可以根据用户的需求手动调整大小,整体体验会大为改善。即使调用了setSizePolicy()
和setSizeGripEnabled()
方法,仍然无法调整窗口大小。 - metasimmb.layout()->setSizeConstraint(QLayout::SetMaximumSize)
(啊,这是C++ - 不熟悉Python语法)。 - Brian Roach