You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pyqtgraph中TextItem字体无法随视图与QGraphicsRectItem同步缩放问题

问题说明

使用pyqtgraph时,对绘图区执行放大/缩小操作,TextItem字体大小始终保持固定,无法和同场景下的QGraphicsRectItem保持一致的缩放速率。
复现代码:

import sys
import pyqtgraph as pg
from PyQt6.QtWidgets import QApplication, QGraphicsRectItem
from pyqtgraph.Qt import QtCore

app = QApplication(sys.argv)
view = pg.GraphicsView()
l = pg.GraphicsLayout()
view.setCentralItem(l)
view.show()
view.resize(800, 600)

p0 = l.addPlot(0, 0)
p0.showGrid(x=True, y=True, alpha=1.0)

# 隐藏上侧绘图的轴标签,消除两个绘图区的间隙
ay0 = p0.getAxis('left')
ay0.setStyle(showValues=False)
p0.hideAxis('right')
ax02 = p0.getAxis('top')
ax02.setStyle(showValues=False)

p1 = l.addPlot(0, 1)
p1.setYLink(p0)

l.layout.setSpacing(0.5)
l.setContentsMargins(0., 0., 0., 0.)

p1.setFixedWidth(300)
p1.setMouseEnabled(x=False)

ax12 = p1.getAxis('top')
ax12.setStyle(showValues=False)
p1.showAxis('right')
p1.hideAxis('left')
p1.setXRange(0, 6, padding=0)

board = ['123456',
         'abcdef',
         'ghilmn']


def draw_board(board2):
    for j, row in enumerate(board2):
        for i, cell in enumerate(row):
            rect_w = 1
            rect_h = 1
            r = QGraphicsRectItem(i, -j+2, rect_w, rect_h)
            r.setPen(pg.mkPen((0, 0, 0, 100)))
            r.setBrush(pg.mkBrush((50, 50, 200)))
            p1.addItem(r)

            t_up = pg.TextItem(cell, (255, 255, 255), anchor=(0, 0))
            t_up.setPos(i, -j+1+2)
            p1.addItem(t_up)


draw_board(board)

if __name__ == '__main__':
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec()
原因分析

pg.TextItem默认开启了ItemIgnoresTransformations图元标志,该标志会强制图元始终按屏幕像素尺寸渲染,不受场景缩放、平移变换影响,这就是缩放操作下字体大小固定的根本原因。

解决方法

创建TextItem实例后,关闭上述忽略变换的标志,同时调整字体大小适配场景坐标系即可,修改后的draw_board函数如下:

def draw_board(board2):
    for j, row in enumerate(board2):
        for i, cell in enumerate(row):
            rect_w = 1
            rect_h = 1
            r = QGraphicsRectItem(i, -j+2, rect_w, rect_h)
            r.setPen(pg.mkPen((0, 0, 0, 100)))
            r.setBrush(pg.mkBrush((50, 50, 200)))
            p1.addItem(r)

            t_up = pg.TextItem(cell, (255, 255, 255), anchor=(0.5, 0.5))
            # 关闭忽略变换标志,让文字随视图同步缩放
            t_up.setFlag(t_up.GraphicsItemFlag.ItemIgnoresTransformations, False)
            # 设置场景坐标系下的字体大小,适配1*1尺寸的矩形格
            text_font = t_up.font()
            text_font.setPointSizeF(0.7)
            t_up.setFont(text_font)
            # 调整位置让文字在矩形格内居中
            t_up.setPos(i + 0.5, -j + 2 + 0.5)
            p1.addItem(t_up)
  • 若需要保留左上角对齐效果,将锚点改回(0,0),位置设置为(i + 0.05, -j + 2 + 0.05)即可
  • setPointSizeF的参数可根据显示效果微调,数值越大文字在场景坐标系下的尺寸越大

内容的提问来源于stack exchange,提问作者Giorgio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:48:58