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

2024-05-10 03:47:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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)

我是不是漏了一步和/或这有可能吗?


Tags: to代码用户文本mb特性results细节
3条回答

这是我要用的解决办法。这不会使对话框的大小可调整,但会使对话框在“详细信息”框可见时自行更改为合理的大小。我毫不羞耻地从谢尔盖·古本科的回答中窃取了一些想法。即使你愿意实现他的大小调整,我谦卑地提供一些其他改进如下。

# 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

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

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

希望这有帮助,问候

这是有效的,但只在Gnome 2下的Linux上测试。它只在水平方向上调整大小,除非“显示详细信息”文本处于启用状态,在这种情况下,它会在两个方向上调整大小。“show details”(显示详细信息)按钮仍将其重置为初始大小,这可能是一个功能,也可能是一个错误,具体取决于您的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;
}

相关问题 更多 >