如何获取小部件的大小

How to get size of widgets

我正在开发 PyQt5 应用程序,但是我遇到了小部件高度的问题。以下是我的问题的简化版本:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class App(QWidget):
    def __init__(self):
        super().__init__()
        self.showMaximized()
        self.setStyleSheet("QWidget {background: blue;}")
        print(self.frameGeometry().height())
        self.show()

if __name__ == "__main__":
    window = QApplication(sys.argv)
    app = App()
    window.setStyle(QStyleFactory.create("Fusion"))
    window.exec_()

这里我创建了一个window并将其最大化。使用 tkinter window,它告诉我最大化的高度是 841,这是我屏幕的大小,但是 PyQt5 应用程序打印高度为 519。这是 self.showMaximized() 方法的问题吗,或者其他问题。

在 Qt 中调整大小不是即时的。 Qt 所做的是从 showMaximized 中获取信息以激活本机 window(依赖于每个 OS 的库)的标志,然后在时间 T 后 OS 应用该标志并发送它新几何。因此,在您的情况下,您必须延迟它才能获得正确的信息。

import sys
from PyQt5.QtWidgets import QApplication, QStyleFactory, QWidget
from PyQt5.QtCore import QTimer


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("QWidget {background: blue;}")
        self.showMaximized()

        QTimer.singleShot(100, self.calculate)

    def calculate(self):
        print(self.frameGeometry().height())


if __name__ == "__main__":
    window = QApplication(sys.argv)
    app = App()
    window.setStyle(QStyleFactory.create("Fusion"))
    window.exec_()

另一方面,如果您的 objective 想知道初始屏幕的大小,那么您不应该为此使用 QWidget,因为它取决于 Qt 和本机库所花费的时间创建本机 window,而不是使用屏幕 class :

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QGuiApplication

if __name__ == "__main__":
    window = QApplication(sys.argv)
    print(QGuiApplication.primaryScreen().availableGeometry().height())