PyQtGraph中GLViewWidget添加3D坐标轴标签报错解决问询
GLViewWidget添加坐标轴标签报错的解决方法(pyqtgraph 0.13.3 + PyQt6)
问题原因
你遇到的报错是因为原示例依赖的是PyQt5及更早版本的QGLWidgetAPI(qglColor、renderText都是旧版QGLWidget的方法),但PyQt6已经移除了这些旧API,且pyqtgraph 0.13.3的GLViewWidget底层基于QOpenGLWidget,不再支持这些旧方法,和版本无关,无需升级降级,只需调整绘制逻辑。
解决代码
修改paintGL方法,改用QPainter在OpenGL画布上绘制2D文本(适配PyQt6和当前pyqtgraph版本):
from pyqtgraph.opengl import GLViewWidget from PyQt6.QtGui import QFont, QColor, QFontMetrics, QPainter from PyQt6.QtWidgets import QApplication class MyGLView(GLViewWidget): def __init__(self, parent=None): super().__init__(parent) def paintGL(self, *args, **kwargs): # 先完成3D场景绘制 super().paintGL(*args, **kwargs) # 启用混合模式,让文本颜色正常显示 self.makeCurrent() self.gl.glEnable(self.gl.GL_BLEND) self.gl.glBlendFunc(self.gl.GL_SRC_ALPHA, self.gl.GL_ONE_MINUS_SRC_ALPHA) # 初始化QPainter绘制2D文本 painter = QPainter(self) painter.setRenderHint(QPainter.RenderHint.Antialiasing) font = QFont() font.setFamily("Tahoma") font.setPixelSize(21) font.setBold(True) painter.setFont(font) title_str = 'Screen Coordinates' metrics = QFontMetrics(font) text_width = metrics.boundingRect(title_str).width() text_height = metrics.boundingRect(title_str).height() # 计算文本居中位置 scrn_width = self.size().width() x_pos = (scrn_width - text_width) // 2 y_pos = text_height + 5 # 设置文本颜色并绘制 painter.setPen(QColor(255, 255, 0, 255)) painter.drawText(x_pos, y_pos, title_str) # 结束绘制,恢复OpenGL状态 painter.end() self.gl.glDisable(self.gl.GL_BLEND) self.doneCurrent() app = QApplication([]) fig1 = MyGLView() fig1.show() app.exec()
关键说明
- 先调用父类
paintGL完成3D场景渲染,再用QPainter叠加绘制2D文本 - 启用OpenGL混合模式是为了让文本的透明通道生效,避免出现色块
- 使用
QPainter的drawText替代旧的renderText,用setPen替代qglColor设置颜色
内容的提问来源于stack exchange,提问作者New2coding
相关产品推荐
相关产品推荐

