레이블의 글꼴 크기를 PyQt5의 레이블에있는 텍스트에 맞게 동적으로 조정하는 방법이 있습니까?

메르겐 스튜디오

API를 통해 플레이어의 현재 위치를 가져오고 레이블에 넣을 텍스트 길이에 따라 레이블의 글꼴 크기를 조정하고 싶습니다.

예를 들어 "Bedwars 4v4v4v4"문자열이 적합합니다.

여기에 이미지 설명 입력

그러나 문자열 "Beast vs. Hunters Insane"은 잘립니다.

여기에 이미지 설명 입력

지금까지 내 코드는 다음과 같습니다.

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(893, 492)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../technostalk icon.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setAccessibleName("")
        MainWindow.setStyleSheet(
        "QMainWindow{\n"
        "background-color: rgb(54, 57, 63);\n"
        "}"
        )
        MainWindow.setUnifiedTitleAndToolBarOnMac(False)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(10, 10, 131, 91))
        self.groupBox.setStyleSheet("QGroupBox{\n"
        "\n"
        "border: 1px solid rgb(32, 34, 37);\n"
        "color: rgb(249, 249, 255);\n"
        "margin-top: 0.5em;\n"
        "}\n"
        "\n"
        "QGroupBox::title {\n"
        "subcontrol-origin: margin;\n"
        "left: 10px;\n"
        "padding: 0 3px 0 3px;\n"
        "}"
        )
        self.groupBox.setObjectName("groupBox")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(10, 10, 171, 51))
        self.label.setStyleSheet(
                "QLabel{\n"
        "color: rgb(0, 255, 0);\n"
        "}"
        )
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setGeometry(QtCore.QRect(10, 60, 101, 16))
        self.label_2.setStyleSheet("QLabel{\n"
        "color: rgb(255, 255, 255);\n"
        "}"
        )
        self.label_2.setObjectName("label_2")
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(150, 10, 221, 91))
        self.groupBox_2.setStyleSheet(
        "QGroupBox{\n"
        "\n"
        "border: 1px solid rgb(32, 34, 37);\n"
        "color: rgb(249, 249, 255);\n"
        "margin-top: 0.5em;\n"
        "}\n"
        "\n"
        "QGroupBox::title {\n"
        "subcontrol-origin: margin;\n"
        "left: 10px;\n"
        "padding: 0 3px 0 3px;\n"
        "}"
        )
        self.groupBox_2.setObjectName("groupBox_2")
        self.label_3 = QtWidgets.QLabel(self.groupBox_2)
        self.label_3.setGeometry(QtCore.QRect(10, 10, 211, 51))
        self.label_3.setStyleSheet(
        "QLabel{\n"
        "\n"
        "color: rgb(255, 255, 255);\n"
        "\n"
        "}"
        )
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.groupBox_2)
        self.label_4.setGeometry(QtCore.QRect(10, 60, 181, 16))
        self.label_4.setStyleSheet(
                "QLabel{\n"
        "color: rgb(255, 255, 255);\n"
        "}"
        )
        self.label_4.setObjectName("label_4")
        MainWindow.setCentralWidget(self.centralwidget)
음악가

전제. 레이블의 글꼴 크기를 컨테이너의 너비에 맞도록 조정하는 것은 일반적으로 좋은 생각이 아닙니다. 가장 중요한 것은 동일한 위젯에 대해 다른 글꼴 크기를 사용하면 전체 인터페이스가 일관성이 없게되기 때문입니다. 이 측면은 사용자 경험에 매우 중요하므로 과소 평가하지 마십시오.

또한 의견에서 이미 제안했듯이 고정 형상을 사용하는 것은 일반적으로 매우 나쁜 생각입니다. 게임 인터페이스의 특정 사례를 이해할 수는 있지만 컨테이너 위젯에 레이아웃 관리자를 사용하는 것을 막지는 않습니다. 그 주된 이유는 컴퓨터 (또는 Designer에서도)에 표시되는 내용이 사용자가 실제로 화면에서 보는 것과 거의 같지 않으며, 사용자가 창 크기를 조정하는 경우 (최대화하거나 크기를 작게 조정하기 위해 화면) 당신은 추악하거나 쓸모없는 인터페이스로 끝날 것입니다.
따라서 전체 인터페이스에 레이아웃 관리자를 사용하고 특정 하위 위젯에 대해서만 고정 도형을 사용하는 것이 좋습니다 (아마도 레이블 만).

어쨌든 가능한 해결책은 QLabel에서 상속 된 사용자 지정 클래스를 사용하고 디자이너의 각 레이블을 해당 사용자 지정 클래스로 승격하는 것입니다 (이 게시물의 끝 부분에서 자세히 설명).

다음은 사용자 정의 클래스의 가능한 구현입니다.

class CustomLabel(QtWidgets.QLabel):
    def adjustFont(self):
        if self.parent():
            # if the widget has a parent, get the available width by computing the
            # available rectangle between the parent rectangle and the widget
            # geometry (logical AND)
            rect = self.parent().rect() & self.geometry()
            width = rect.width()
        else:
            width = self.width()
        font = self.font()
        text = self.text()
        while True:
            # compute the text width with the current font size
            textWidth = QtGui.QFontMetrics(font).size(
                QtCore.Qt.TextSingleLine, text).width()
            # break if the width is enough to show the text or the font size is
            # sufficient to keep the text readable
            if textWidth <= width or font.pointSize() <= 6:
                break
            font.setPointSize(font.pointSize() - 1)
        self._font = font

    def setText(self, text):
        super().setText(text)
        self.adjustFont()

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

    def paintEvent(self, event):
        if self.text():
            qp = QtGui.QPainter(self)
            qp.setFont(self._font)
            qp.drawText(self.rect(), self.alignment(), self.text())
        else:
            super().paintEvent(event)

승격 된 위젯은 특수 기능에 대해 상속 된 클래스의 기능을 구현하는 사용자 정의 하위 클래스를 사용하는 방법입니다.

위젯을 승격하려면 마우스 오른쪽 버튼을 클릭하고 "Promote to ..."를 선택하고 "Promoted class name"필드에 클래스 이름을 삽입하고 "Header file"필드에 클래스가 포함 된 파일을 python 모듈이므로 클래스가 "mylabel.py"파일에 있으면 "mylabel"을 삽입하십시오.) "추가"를 클릭 한 다음 "승격"을 클릭하십시오.
새 승격 된 위젯 클래스가 추가되면 컨텍스트 메뉴의 "승격 대상"하위 메뉴에서 승격 된 클래스를 선택하여 동일한 유형의 다른 위젯을 승격 할 수 있습니다.

마지막으로, 당신이해야 기억 마십시오 에 의해 생성 된 파일을 수정하지 pyuic않고 (대한 자세한 읽기 모방에 자신의 행동을 시도 디자이너를 사용하여 파일 저장, 그래서 디자이너 레이블을 촉진)과 함께 다시 생성 pyuic한 후 다음을 포함하는 새로운 스크립트를 만들 코드 (이 경우 pyuic 생성 파일의 이름은 mainWindow_ui.py) :

from PyQt5 import QtCore, QtGui, QtWidgets
from mainWindow_ui import Ui_MainWindow

class CustomLabel(QtWidgets.QLabel):
# ... as the above example

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.label.setText('Short text')
        self.label_3.setText('Very very very very very very very very very long text')


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관