PySide6/PyQt6中QTextEdit自动换行时实现缩进效果
实现QTextEdit自动换行行首缩进区分段落
要实现手动换行的新段落首行无缩进,自动换行的内容行首缩进的效果,无需用到QTextLayout,只需调整QTextBlockFormat的悬挂缩进参数即可——核心思路是给段落设置左侧边距,同时让首行反向偏移抵消这个边距,这样首行对齐左边界,后续自动换行的行则保持边距缩进。
修改后的代码
import sys from PySide6.QtWidgets import QApplication, QWidget, QTextEdit, QVBoxLayout from PySide6.QtGui import QTextCursor, QTextBlockFormat class Widget(QWidget): def __init__(self): super().__init__() self.text_edit = QTextEdit() v_layout = QVBoxLayout() v_layout.addWidget(self.text_edit) self.setLayout(v_layout) self.text_edit.setPlainText( "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Fusce malesuada lacus nec sapien hendrerit mollis. Etiam " + "euismod consequat magna sed ornare. Donec dapibus aliquet " + "turpis eget gravida. Morbi porttitor orci pharetra magna " + "ultrices, vel facilisis mauris ullamcorper. Curabitur a " + "fringilla arcu. Mauris vulputate sodales blandit.\n" + "Nam pellentesque volutpat est vitae ultrices. Nam at augue " + "quis massa porttitor suscipit et ac neque. \n" + "Cras dolor risus, lobortis nec nisl nec, suscipit iaculis " + "tellus. Nulla non bibendum elit, ut gravida lacus. " + "est modi necessitatibus. \n" + "Hic rerum voluptas voluptatem. \n" + "Ut expedita unde eum molestias voluptatem aut" + "dignissimos dolor. \n") cursor = QTextCursor(self.text_edit.document()) cursor.select(QTextCursor.Document) fmt = QTextBlockFormat() # 设置段落左侧边距(自动换行后的行缩进量) fmt.setLeftMargin(40) # 设置首行反向偏移,抵消左侧边距,让首行对齐左边界 fmt.setTextIndent(-40) cursor.mergeBlockFormat(fmt) app = QApplication(sys.argv) widget = Widget() widget.show() app.exec()
原理说明
setLeftMargin(40):给整个段落设置40像素的左侧边距,这会让段落内所有行都向右偏移40像素。setTextIndent(-40):给段落首行设置负的缩进值,让首行向左偏移40像素,刚好抵消左侧边距,所以首行看起来和无缩进一样。- 这样一来,手动换行产生的新段落首行对齐左边界,而段落内自动换行的后续行则保持40像素的缩进,完美区分两种换行类型。
内容的提问来源于stack exchange,提问作者Cuissedemouche
相关产品推荐
相关产品推荐

