
在 pyside6 中,`qpainter.drawtext()` 默认不支持自动换行;需正确组合 `qt.alignmentflag` 与 `qt.textflag.textwordwrap`(而非 `qtextoption.wrapmode`)才能使长文本在指定矩形内按词换行并居中对齐。
要在 QPainter 绘图过程中实现文本在矩形区域内的自动换行(Word Wrap),关键在于正确使用 Qt.TextFlag.TextWordWrap 标志 —— 它是专为 drawText() 设计的换行控制标识,不可与 QTextOption.WrapMode 混用(后者属于 QTextOption 类,用于 QTextDocument 或富文本布局场景,直接传入 drawText() 会导致类型错误或崩溃)。
✅ 正确写法如下(适配你的原始代码):
from PySide6.QtCore import Qt, QRect
from PySide6.QtGui import QPainter
# 假设 painter 已初始化,self.* 为已有属性
rectangle = QRect(self.startX, self.startY, int(self.Width), int(self.Length))
painter.fillRect(rectangle, self.colorList[i])
painter.drawText(
rectangle,
Qt.AlignmentFlag.AlignCenter | Qt.TextFlag.TextWordWrap, # ✅ 正确组合:对齐 + 换行标志
self.AssiName[i] # 注意:问题中变量名疑似笔误,应为 self.AssiName[i] 而非 self.AssName[i]
)
painter.drawRect(rectangle)⚠️ 注意事项:
- Qt.TextFlag.TextWordWrap 是 PySide6(及 PyQt6)中 drawText() 唯一支持的原生换行标志,必须与 Qt.AlignmentFlag 按位或(|)组合使用;
- 不要导入或使用 QTextOption(如 QTextOption.WrapMode.WordWrap),它不适用于 QPainter.drawText(),强行传入将引发 TypeError 或运行时崩溃;
- 文本换行行为依赖矩形宽度:若高度不足,换行后文字可能被截断;建议确保矩形高度足够容纳多行文本(可结合 fontMetrics().boundingRect() 预估所需高度);
- 若需更精细控制(如省略号、行距、HTML 渲染),应改用 QTextDocument + drawContents(),但会显著增加复杂度,普通标签式文本推荐坚持 drawText() + TextWordWrap 方案。
总结:只需将原错误写法
Qt.AlignmentFlag.AlignCenter | QTextOption.WrapMode.WordWrap
替换为
Qt.AlignmentFlag.AlignCenter | Qt.TextFlag.TextWordWrap,
即可安全、高效地启用居中+自动换行功能,完美适配动态尺寸矩形的批量绘制场景。










