Расчет высоты проблемы QWidget между функцией инициализации и события в pyqt5 - PullRequest
1 голос
/ 18 июня 2020

Я создал только один кадр и хочу вычислить его высоту. Я могу получить 30 (по умолчанию) в функции конструктора. но позже. Я могу получить 259 (правильное значение). кто-нибудь может мне это объяснить? и я хочу получить правильное значение в функции инициализации.

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.frame = QWidget(self)
        vbox = QVBoxLayout(self)
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        vbox.addWidget(QLabel('11111111'))
        self.frame.setLayout(vbox)
        self.setCentralWidget(self.frame)
        print(self.frame.height())
    def enterEvent(self,event):
        print(self.frame.height())
        pass
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 18 июня 2020

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

Если вы хотите получить размер, вы должны вызвать его после использования метода show ():

self.setCentralWidget(self.frame)
<b>self.show()</b>
print(self.frame.height())

Другая возможность - использовать sizeHint, который возвращает размер по умолчанию, который должен иметь виджет на основе его содержимого (QLabels)

self.setCentralWidget(self.frame)
print(<b>self.frame.sizeHint().height()</b>)
...