QGraphicsTextItem文本居中时的宽度自适应与HTML导出问题
解决方案
问题核心是固定setTextWidth导致的自动软换行(无法被toHtml捕获),要实现宽度自适应+文本居中,只需让setTextWidth始终匹配文本内容的理想宽度(不换行时的内容宽度),同时保留文本居中样式。
修改后的代码如下:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsTextItem, QVBoxLayout, QWidget from PyQt5.QtGui import QFont from PyQt5.QtCore import Qt class MyMainWindow(QMainWindow): def __init__(self): super().__init__() self.central_widget = QWidget() self.layout = QVBoxLayout(self.central_widget) self.view = QGraphicsView() self.scene = QGraphicsScene(self) self.view.setScene(self.scene) self.view.setSceneRect(0, 0, 400, 300) self.editable_text = QGraphicsTextItem() self.editable_text.setTextInteractionFlags(Qt.TextEditorInteraction) self.editable_text.setFlags(QGraphicsTextItem.ItemIsSelectable | QGraphicsTextItem.ItemIsMovable | QGraphicsTextItem.ItemIsFocusable) # 保留文本居中的HTML样式 self.editable_text.setHtml('<div style="text-align: center;">This is an example TEXT</div>') # 初始设置为文档理想宽度,避免自动换行 self.editable_text.setTextWidth(self.editable_text.document().idealWidth()) self.editable_text.setFont(QFont('Arial', 20)) self.editable_text.document().contentsChange.connect(self.adjust_text_width) self.scene.addItem(self.editable_text) self.layout.addWidget(self.view) self.setCentralWidget(self.central_widget) def adjust_text_width(self): # 内容变化时,更新宽度为当前文档的理想宽度 self.editable_text.setTextWidth(self.editable_text.document().idealWidth()) app = QApplication(sys.argv) main_window = MyMainWindow() main_window.resize(800, 500) main_window.show() sys.exit(app.exec_())
关键说明
document().idealWidth()会返回文本不换行时的实际宽度,以此设置setTextWidth,彻底避免自动软换行。- 保留HTML的
text-align: center样式,确保文本内容在自身容器内居中显示。 - 移除了不稳定的
adjustSize()调用,因为setTextWidth匹配理想宽度后,item尺寸会自动适配内容。 - 此时
toHtml输出的内容仅包含用户手动输入的硬换行(如回车),完全满足写入ASS文件的需求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

