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
相关产品推荐
相关产品推荐

