PyQt5 QSpinBox – 获取字体的紧缩边界矩形

  • Post category:Python

PyQt5是Python语言中的一种GUI(图形用户界面)编程框架,其中QSpinBox是一个用于选择数字的窗口小部件。获取字体的紧缩边界矩形是指在界面中显示的文本所在的矩形,该矩形恰好包含所显示的文本,不会有额外的空白边缘。

下面是一份PyQt5 QSpinBox-获取字体的紧缩边界矩形的使用攻略:

1. 导入必要的库

在开始使用QSpinBox控件之前,需要先导入以下三个必要的库:

from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QSpinBox, QVBoxLayout
from PyQt5.QtGui import QFontMetrics
from PyQt5.QtCore import Qt
  • QMainWindow:主窗口控件
  • QWidget:父级窗口控件
  • QSpinBox:QSpinBox控件
  • QVBoxLayout:垂直布局管理器
  • QFontMetrics:用于测量字符串大小的类
  • Qt:包含许多常量,例如自动对齐以及居中等

2. 创建QSpinBox

__init__函数中创建QSpinBox的实例,并通过setRange函数设置范围:

self.spinBox = QSpinBox(self)
self.spinBox.setRange(-1000, 1000)

3. 创建主窗口控件

__init__函数中创建主窗口窗口控件,并通过setCentralWidget函数设置布局:

self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)

4. 创建垂直布局管理器

__init__函数中,创建一个垂直布局管理器,并将QSpinBox控件添加到其中:

self.layout = QVBoxLayout()
self.layout.addWidget(self.spinBox)
self.centralWidget.setLayout(self.layout)

5. 获取字体的紧缩边界矩形

paintEvent事件函数中获取字体的紧缩边界矩形,以便确定界面中文本应该呈现的位置:

def paintEvent(self, event):
    painter = QPainter(self)
    painter.setRenderHint(QPainter.Antialiasing, True)
    painter.setPen(QPen(Qt.white))
    font = self.spinBox.font()
    fm = QFontMetrics(font)
    rect = fm.tightBoundingRect(str(self.spinBox.value()))

其中,painter是PyQt5中的一个画家对象,用于进行绘图操作,setRenderHint方法可以设置绘图时使用的渲染方式,setPen方法可以设置画笔的颜色,font属性可以获取QSpinBox的当前字体,fm对象是QFontMetrics类的实例,用于获取当前字体的一些度量信息,而tightBoundingRect方法则可以计算字符串在绘制时所需矩形空间。

6. 绘制文本

paintEvent事件函数中绘制文本,完成后将画家对象交还给系统的渲染引擎进行绘制:

    painter.translate(self.rect().center() - rect.center())
    painter.drawText(rect.topLeft(), str(self.spinBox.value()))
    painter.end()

其中,translate方法可以将画家对象的绘制坐标系偏移,以避免文本超出界面,drawText方法可以在指定坐标位置绘制文本,最后通过painter.end()方法结束绘图操作。

下面是一个完整的例子,以两个不同的字体大小来绘制QSpinBox控件的值:

from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QSpinBox, QVBoxLayout
from PyQt5.QtGui import QFontMetrics
from PyQt5.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.spinBox = QSpinBox(self)
        self.spinBox.setRange(-1000, 1000)

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.spinBox)
        self.centralWidget.setLayout(self.layout)

        self.show()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing, True)
        painter.setPen(QPen(Qt.white))

        font1 = self.spinBox.font()
        font2 = self.spinBox.font()
        font2.setPointSize(40)

        fm1 = QFontMetrics(font1)
        fm2 = QFontMetrics(font2)

        rect1 = fm1.tightBoundingRect(str(self.spinBox.value()))
        rect2 = fm2.tightBoundingRect(str(self.spinBox.value()))

        painter.translate(self.rect().center() - rect1.center())
        painter.drawText(rect1.topLeft(), str(self.spinBox.value()))

        painter.translate(0, 50)
        painter.translate(self.rect().center() - rect2.center())
        painter.setFont(font2)
        painter.drawText(rect2.topLeft(), str(self.spinBox.value()))

        painter.end()


if __name__ == '__main__':
    app = QApplication([])
    win = MainWindow()
    app.exec()

上述代码中,首先创建了一个QMainWindow窗口,并在该窗口中加入了一个QSpinBox控件。然后,创建一个QWidget对象,将其设置为主窗口中的中央窗口,并在其内部使用QVBoxLayout布局管理器,将QSpinBox添加进去。最后,重写了paintEvent事件函数,实现了绘制两种不同字体大小的QSpinBox的值的效果。