Как получить размер виджета внутри layout?

Мне нужно получить текущий размер виджета который находится внутри layout Я пробовал разные данные но нужного результат я не получил.

Как я могу получить точный размер виджета?

import sys
from PyQt5 import QtWidgets


class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1000, 1000)

        lay = QtWidgets.QGridLayout(self)
        lay.setSpacing(0)
        lay.setContentsMargins(0, 0, 0, 0)

        wid1 = QtWidgets.QWidget(self)
        wid1.setStyleSheet('background:red')
        lay.addWidget(wid1,0,0,1,1)

        wid2 = QtWidgets.QWidget(self)
        wid2.setStyleSheet('background:green')
        lay.addWidget(wid2,1,0,1,1)

        wid3 = QtWidgets.QWidget(self)
        wid3.setStyleSheet('background:blue')
        lay.addWidget(wid3,0,1,1,1)

        wid4 = QtWidgets.QWidget(self)
        wid4.setStyleSheet('background:yellow')
        lay.addWidget(wid4,1,1,1,1)

        print(wid4.geometry())
        print(wid4.sizeHint().width())
        print(wid4.sizeHint().height())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())

ответ на подобие self.height() / 4 мне не подходит


Ответы (1 шт):

Автор решения: gil9red

Можно прослеживать размер в обработчике события resizeEvent и актуальный размер виджета можно получить у size / geometry / widget+height

Пример:

import sys
from PyQt5 import QtWidgets


class MyWidget(QtWidgets.QDialog):
    pass


class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1000, 1000)

        lay = QtWidgets.QGridLayout(self)
        lay.setSpacing(0)
        lay.setContentsMargins(0, 0, 0, 0)

        wid1 = QtWidgets.QWidget(self)
        wid1.setStyleSheet('background:red')
        lay.addWidget(wid1, 0, 0, 1, 1)

        wid2 = QtWidgets.QWidget(self)
        wid2.setStyleSheet('background:green')
        lay.addWidget(wid2, 1, 0, 1, 1)

        wid3 = QtWidgets.QWidget(self)
        wid3.setStyleSheet('background:blue')
        lay.addWidget(wid3, 0, 1, 1, 1)

        self.wid4 = QtWidgets.QWidget(self)
        self.wid4.setStyleSheet('background:yellow')
        lay.addWidget(self.wid4, 1, 1, 1, 1)

        self.wid = MyWidget(parent=self)
        self.wid.show()

    def resizeEvent(self, event):
        super().resizeEvent(event)

        self.wid.resize(self.wid4.size())
        print('resizeEvent', self.wid4.size())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())

Будет выведено:

resizeEvent PyQt5.QtCore.QSize(500, 500)
→ Ссылка