如何在PyQt4中允许调整QMessageBox的大小

met*_*sim 3 python user-interface qt4 pyqt4

我正在使用QMessageBox中的不错的功能来向用户显示详细的文本。但是,展开后的窗口仍然很小,因此人们立即尝试调整窗口大小,以便可以看到更多细节。即使设置了我认为正确的设置,它也不允许调整大小。

这是PyQt4代码的相关代码段:

mb = QMessageBox()
mb.setText("Results written to '%s'" % filename)
mb.setDetailedText(str(myData))
mb.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
mb.setSizeGripEnabled(True)
Run Code Online (Sandbox Code Playgroud)

我是否错过了某个步骤,并且/或者这完全有可能吗?

ser*_*nko 6

如果您想制作一个可调整大小的消息框,请检查以下代码是否适合您:

class MyMessageBox(QtGui.QMessageBox):
    def __init__(self):
        QtGui.QMessageBox.__init__(self)
        self.setSizeGripEnabled(True)

    def event(self, e):
        result = QtGui.QMessageBox.event(self, e)

        self.setMinimumHeight(0)
        self.setMaximumHeight(16777215)
        self.setMinimumWidth(0)
        self.setMaximumWidth(16777215)
        self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)

        textEdit = self.findChild(QtGui.QTextEdit)
        if textEdit != None :
            textEdit.setMinimumHeight(0)
            textEdit.setMaximumHeight(16777215)
            textEdit.setMinimumWidth(0)
            textEdit.setMaximumWidth(16777215)
            textEdit.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)

        return result
Run Code Online (Sandbox Code Playgroud)

下面是 messagebox 的调用方式:

mb = MyMessageBox()
mb.setText("Results written to '%s'" % 'some_file_name')
mb.setDetailedText('some text')
mb.exec_()
Run Code Online (Sandbox Code Playgroud)

解决方案取自here

希望这有帮助,问候


Pau*_*ton 5

这是我要使用的解决方案。这不会使对话框可调整大小,但是会在细节框可见时使对话框本身更改为合理的大小。我毫不掩饰地偷了serge_gubenko的回答中的一些想法。即使您希望实现他的大小调整,我也会在下面谦虚地提供其他一些改进。

# Safe since everything in the namespace begins with 'Q'
from PyQt4.QtGui import *

class MyMessageBox(QMessageBox):

    # This is a much better way to extend __init__
    def __init__(self, *args, **kwargs):            
        super(MyMessageBox, self).__init__(*args, **kwargs)
        # Anything else you want goes below

    # We only need to extend resizeEvent, not every event.
    def resizeEvent(self, event):

        result = super(MyMessageBox, self).resizeEvent(event)

        details_box = self.findChild(QTextEdit)
        # 'is not' is better style than '!=' for None
        if details_box is not None:
            details_box.setFixedSize(details_box.sizeHint())

        return result
Run Code Online (Sandbox Code Playgroud)