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

时间:2010-04-16 18:38:19

标签: python user-interface qt4 pyqt4

我正在使用QMessageBox中的nice功能来选择向用户显示详细文本。但是,扩展后的窗口仍然相当小,并且会立即尝试调整窗口大小,以便可以看到更多细节。即使设置了我认为正确的设置,它也不允许调整大小。

以下是PyQt4代码的相关片段:

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

我是否错过了一步和/或这是否可能?

3 个答案:

答案 0 :(得分:4)

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

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

这里是如何调用messagebox:

mb = MyMessageBox()
mb.setText("Results written to '%s'" % 'some_file_name')
mb.setDetailedText('some text')
mb.exec_()

解决方案取自here

希望这有帮助,尊重

答案 1 :(得分:4)

这是我将使用的解决方案。这不会使对话框可调整大小,但它确实使对话框在可见详细信息框时将其自身更改为合理的大小。我毫不掩饰地从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

答案 2 :(得分:0)

这样可行,但仅在Gnome 2下的Linux上进行了测试。它仅在水平方向上调整大小,除非"显示详细信息"文本已打开,在这种情况下,它会在两个方向上调整大小。 "显示细节"按钮仍然会将其重置为初始大小,这可能是一个功能或错误,具体取决于您的pov:

bool MyMessageBox::event(QEvent* e)
{
    bool result = QMessageBox::event(e);
    // force resizing back on, QMessageBox keeps turning it off:
    if (maximumWidth() != QWIDGETSIZE_MAX) {
        QTextEdit *textEdit = findChild<QTextEdit*>();
        if (textEdit && textEdit->isVisible()) {
            textEdit->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
            textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
            setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        } else {
            setMaximumWidth(QWIDGETSIZE_MAX);
            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
        }
    }
    return result;
}