Максимальный размер окна PyQt4 регистрируется только после перемещения или изменения размера окна пользователем

Я создаю графический интерфейс, который частично генерируется QtCreator и частично кодом Python. Графический интерфейс представляет собой область прокрутки макета сетки внутри макета сетки. Область прокрутки содержит переменное количество кнопок. Моя цель - изменить размер окна, чтобы оно точно соответствовало сетке кнопок, если не слишком много кнопок, которые делают окно слишком большим, в этом случае я хотел бы ограничить размер окна и сделать область прокрутки прокручиваемой. Я добился этого, но есть проблема, когда окно слишком большое, оно сжимается до нужных размеров только после того, как я вручную перемещаю или изменяю размер окна. (Обратите внимание, что функции «show» и «resizeEvent» переопределены)

Изображение графического интерфейса:

введите здесь описание изображения

QtCreator:

QtCreator

Код питона:

import sys
from PyQt4 import QtGui, uic
import win32api

qtCreatorMainWindowFile = "map2.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorMainWindowFile)


class Map(QtBaseClass, Ui_MainWindow):

    NUM_OF_COLS = 30
    NUM_OF_ROWS = 30

    def __init__(self):
        QtBaseClass.__init__(self)
        self.setupUi(self)
        self.window_max_width = win32api.GetSystemMetrics(0) * 3/4
        self.window_max_height = win32api.GetSystemMetrics(1) * 3/4

        self.buttons = []

        for row in range(self.NUM_OF_ROWS):
            self.buttons_row = []
            for col in range(self.NUM_OF_COLS):
                self.buttons_row.append(QtGui.QPushButton())
                self.buttons_row[-1].setText(str(col)+","+str(row))
                self.buttons_row[-1].setMaximumWidth(35)
                self.mapGridLayout.addWidget(self.buttons_row[-1], row, col)
            self.buttons.append(self.buttons_row)

    # Should only be called after "show" for geometry fields to be updated
    def resize_scroll_area(self):
        self.mapScrollArea.setMinimumWidth(self.mapScrollAreaWidgetContents.sizeHint().width() + self.buttons[0][0].x())
        self.mapScrollArea.setMinimumHeight(self.mapScrollAreaWidgetContents.sizeHint().height() + self.buttons[0][0].y())

    def resizeEvent(self, event):
        if (self.width() > self.window_max_width) or (self.height() > self.window_max_height):
            self.mapScrollArea.setMinimumHeight(0)
            self.mapScrollArea.setMinimumWidth(0)
            self.setMaximumHeight(self.window_max_height)
            self.setMaximumWidth(self.window_max_width)
        return super(Map, self).resizeEvent(event)

    def show(self):
        ret = super(Map, self).show()
        self.move(0, 0)
        self.resize_scroll_area()
        return ret

# --------- Main code ----------
app = QtGui.QApplication(sys.argv)
map = Map()
map.show()
sys.exit(app.exec_())

person sas    schedule 29.07.2017    source источник
comment
Пожалуйста, поделитесь файлом .ui   -  person eyllanesc    schedule 30.07.2017
comment
Файл .ui: dropbox.com/s/v1jbdpw2k6kxgq2/map2.ui? дл=0   -  person sas    schedule 30.07.2017


Ответы (1)


Решение состоит в том, чтобы добавить эти две строки в resizeEvent:

def resizeEvent(self, event):
    if (self.width() > self.window_max_width) or (self.height() > self.window_max_height):
        self.mapScrollArea.setMinimumHeight(0)
        self.mapScrollArea.setMinimumWidth(0)
        ######## Add these two lines: ########
        self.setMinimumHeight(0)
        self.setMinimumWidth(0)
        #######################################
        self.setMaximumHeight(self.window_max_height)
        self.setMaximumWidth(self.window_max_width)
    return super(Map, self).resizeEvent(event)

Проблема, по-видимому, заключается в том, что в этом месте кода максимальный размер главного окна был меньше минимального размера. Таким образом, установка максимального размера не имела никакого эффекта. Прежде чем пользователь изменит размер или переместит окно, минимальный размер каким-то образом обновляется, и все это работает (осталось исследовать - если кто-то знает, как именно это происходит, я буду рад услышать)

person sas    schedule 30.09.2017