Как разрешить изменение размера QMessageBox в PyQt4 - PullRequest
3 голосов
/ 16 апреля 2010

Я использую приятную функцию в QMessageBox, чтобы при желании показать подробный текст пользователю Однако окно после развертывания все еще довольно мало, и сразу же пытаются изменить размер окна, чтобы было видно больше деталей. Даже после того, как я установил правильные настройки, он не позволит изменить размер.

Вот соответствующий фрагмент кода PyQt4:

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

Я пропускаю шаг и / или это вообще возможно?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

Это решение, которое я бы использовал. Это не делает размер диалогового окна изменяемым, но оно заставляет само диалоговое окно изменить размер до разумного размера, когда окно подробностей становится видимым. Я бессовестно украл некоторые идеи из ответа 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
4 голосов
/ 19 апреля 2010

если вы хотите создать окно сообщения с изменяемым размером, пожалуйста, проверьте, будет ли работать код ниже:

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

вот как называется окно сообщения:

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

решение взято из здесь

надеюсь, это поможет, с уважением

0 голосов
/ 07 апреля 2016

Это работает, но проверено только в Linux под Gnome 2. Он изменяет размеры только по горизонтали, если не включен текст «Показать подробности», в этом случае он изменяет размеры в обоих направлениях.Кнопка «показать подробности» все еще сбрасывает ее до первоначального размера, это либо функция, либо ошибка, в зависимости от вашего 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;
}
...