【问题标题】:Pyqt label changes window size when resizing label [duplicate]Pyqt标签在调整标签大小时改变窗口大小[重复]
【发布时间】:2019-09-15 04:07:02
【问题描述】:

我正在学习 pyqt,并试图在小部件中间制作一段文本,当小部件大小根据小部件窗口的大小更改时,它会更改字体大小。我有一些我想要的东西,除了当水平扩展窗口时,在某个点,它也会自动垂直扩展窗口。

我怀疑它与填充有关。水平拖动窗口大小时所需的行为是让文本按比例缩放,直到它会导致窗口的垂直尺寸发生变化,此时不再更改字体大小。

下面是到目前为止我用一堆打印语句来计算大小的结果,但由于某种原因,没有任何东西与窗口的大小相匹配。

from PyQt5.QtWidgets import (QWidget,QHBoxLayout,QLabel,QApplication,QSizePolicy)
from PyQt5.QtGui import QFont, QFontMetrics
from PyQt5.QtCore import Qt,pyqtSignal
import sys

class alarm(QWidget):
    resized = pyqtSignal()
    def __init__(self):
        super().__init__()

        self.setGeometry(300, 300, 150, 150)
        self.setWindowTitle("Alarm Clock")

        self.init_UI()

    def init_UI(self):
        self.counter = 0
        self.resized.connect(self.set_font_size)
        self.time = QLabel('Test')
        self.time.setFont(QFont('Times New Roman'))
        self.time.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)

        self.time.setAlignment(Qt.AlignCenter)
        hbox = QHBoxLayout()
        hbox.addWidget(self.time)

        self.setLayout(hbox)
    def resizeEvent(self,event):
        self.resized.emit()

    def set_font_size(self):
        curr_geo = self.geometry().width()
        font = self.time.font()
        curr_pixel_size = font.pixelSize()
        new_pixel_size = curr_geo/3

        font.setPixelSize(new_pixel_size)
        t = self.time.contentsRect().height()
        print('Label contents rect: ',t)
        print('label height: ' + str(t))
        new_bounding = QFontMetrics(font).boundingRect(self.time.text())

        print('New bounding: ' + str(new_bounding.height()))
        print('Total height: ' + str(self.geometry().height()))
        if new_bounding.height() > self.geometry().height():
            font.setPixelSize(curr_pixel_size)
            self.time.setFont(font)
        else:
            font.setPixelSize(new_pixel_size)
            self.time.setFont(font)

if __name__ == "__main__":
    app = QApplication([])
    alarm = alarm()
    alarm.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt5


    【解决方案1】:

    使用标签高度time

    if new_bounding.height() > self.time.height():
    

    甚至没有else:

        if new_bounding.height() <= self.time.height():
            font.setPixelSize(new_pixel_size)
            self.time.setFont(font)
    

    完整代码:

    from PyQt5.QtWidgets import (QWidget,QHBoxLayout,QLabel,QApplication,QSizePolicy)
    from PyQt5.QtGui import QFont, QFontMetrics
    from PyQt5.QtCore import Qt,pyqtSignal
    import sys
    
    class alarm(QWidget):
        resized = pyqtSignal()
        def __init__(self):
            super().__init__()
    
            self.setGeometry(300, 300, 150, 150)
            self.setWindowTitle("Alarm Clock")
    
            self.init_UI()
    
        def init_UI(self):
            self.counter = 0
            self.resized.connect(self.set_font_size)
            self.time = QLabel('Test')
            self.time.setFont(QFont('Times New Roman'))
            self.time.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
    
            self.time.setAlignment(Qt.AlignCenter)
            hbox = QHBoxLayout()
            hbox.addWidget(self.time)
    
            self.setLayout(hbox)
        def resizeEvent(self,event):
            self.resized.emit()
    
        def set_font_size(self):
            curr_geo = self.geometry().width()
            font = self.time.font()
            curr_pixel_size = font.pixelSize()
            new_pixel_size = curr_geo/3
    
            font.setPixelSize(new_pixel_size)
            t = self.time.contentsRect().height()
            print('Label contents rect: ',t)
            print('label height: ' + str(t))
            new_bounding = QFontMetrics(font).boundingRect(self.time.text())
    
            print('New bounding: ' + str(new_bounding.height()))
            print('Geometry height: ' + str(self.geometry().height()))
            print('Label height: ' + str(self.time.height()))
            if new_bounding.height() <= self.time.height():
                font.setPixelSize(new_pixel_size)
                self.time.setFont(font)
    
    if __name__ == "__main__":
        app = QApplication([])
        alarm = alarm()
        alarm.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 我想你误解了 - 问题是当我只是在缩放文本时调整它的宽度时,它会自动调整整个窗口的高度。我找到了解决方案here
    • 当我改变寡妇的宽度时,它不会改变窗口的高度。你期待更多吗?
    • 我添加了完整的代码。
    • 我检查了你的链接,它似乎与我的代码类似。它将文本的高度与标签的高度进行比较。
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多