QGridLayout не обновляется при изменении размера содержимого? - PullRequest
2 голосов
/ 15 июня 2019

Я пытаюсь использовать QGridLayout для хранения виджетов с изменяемым размером, но когда я изменяю их размер, он не работает, ячейки QGridLayout остаются одинакового размера ...

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

from PyQt5 import QtGui, QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import QSizePolicy
import sys

class Rect(QtWidgets.QFrame):
    def __init__(self, width, height):
        super().__init__()
        self.w = width
        self.h = height
        self.setStyleSheet("background-color: red")

    def mouseDoubleClickEvent(self, a0: QtGui.QMouseEvent):
        self.w *= 2
        self.h *= 2

        print(self.sizeHint())

    def sizeHint(self):
        return QSize(self.w,self.h)

    def minimumSizeHint(self):
        return self.sizeHint()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    gridLayout = QtWidgets.QGridLayout()

    gridLayout.addWidget(Rect(100,100), 0, 0, 1, 1)
    gridLayout.addWidget(Rect(100,100), 1, 1, 1, 1)
    gridLayout.addItem(QtWidgets.QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding), 2, 2, 1, 1)

    container = QtWidgets.QFrame()
    container.setLayout(gridLayout)

    container.resize(600,600)
    container.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 15 июня 2019

Если вы хотите, чтобы об изменении sizeHint() было сообщено в макете, вы должны использовать метод updateGeometry():

def mouseDoubleClickEvent(self, event):
    self.w *= 2
    self.h *= 2
    self.updateGeometry() # <---
    super(Rect, self).mouseDoubleClickEvent(event)

С другой стороны, если вы измените размер окна, он не изменит размер Rect, поскольку QSpacerItem будет занимать весь размер, который он может.

...