def paintEvent(self, e): if not self.buf: return qp = QPainter() qp.begin(self) g = QGlyphRun() g.setRawFont(self.rf) g.setGlyphIndexes([x.codepoint for x in self.buf.glyph_infos]) pos = (0, 0) poses = [] for _p in self.buf.glyph_positions: p = _p.position # Y coordinates go down, not up. poses.append(self.scale_point(pos[0] + p[0], pos[1] - p[1])) pos = (pos[0] + p[2], pos[1] + p[3]) g.setPositions(poses) qp.drawGlyphRun(e.rect().marginsRemoved(self.margins).bottomLeft(), g) qp.end()