Как я могу получить размер виджета, который внутри макета - PullRequest
1 голос
/ 25 апреля 2020

У меня есть QLabel в макете QWidget, я пытаюсь использовать sizeHint или geometry, но это не работает. как я могу получить ширину и высоту QLabel?

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(689, 439)
        self.horizontalLayout = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "Form", None, -1))
        self.label.setText(QtWidgets.QApplication.translate("Form", "TextLabel", None, -1))

import sys,os,asyncio
from PySide2 import QtWidgets
from PySide2.QtWidgets import (QApplication, QMainWindow, QMessageBox)
from qasync import QEventLoop, asyncSlot, asyncClose
from TestLB2 import Ui_Form

class LB(QtWidgets.QWidget, Ui_Form):


    def __init__(self, *args, **kwargs):
        super(LB, self).__init__(*args, **kwargs)
        self.setupUi(self)

        print(self.frameGeometry().width())
        print(self.label.geometry().width())
        print(self.label.sizeHint().width())


if __name__ == '__main__':

    # mp.freeze_support()
    app = QApplication(sys.argv)
    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)
    w = LB()
    w.show()
    sys.exit(app.exec_())
    with loop:
        loop.run_forever()

1 Ответ

2 голосов
/ 25 апреля 2020

По соображениям эффективности только свойства геометрии c обновляются при необходимости, в случае макетов и виджетов они обновляются только при их отображении, поэтому вы не получите желаемые значения. Решение состоит в том, чтобы получить эту информацию мгновенно после ее отображения с помощью QTimer.

import asyncio
import os
import sys

from PySide2 import QtCore, QtWidgets

from qasync import QEventLoop, asyncSlot, asyncClose

from TestLB2 import Ui_Form


class LB(QtWidgets.QWidget, Ui_Form):
    def __init__(self, *args, **kwargs):
        super(LB, self).__init__(*args, **kwargs)
        self.setupUi(self)
        #
        self.label.setStyleSheet("QLabel{background-color: red}")
        QtCore.QTimer.singleShot(0, lambda: print(self.label.width()))


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)
    w = LB()
    w.show()
    with loop:
        loop.run_forever()
...