我正在寻找一种方法来更改QTextCharFormat
QTextEdit
的{{1}},而不会触发添加撤消命令。让我解释一下:
使用QTextBlock
方法可以轻松更改QTextCharFormat
的{{1}}。假设我们有QTextBlock
名为QTextCursor::setBlockCharFormat()
,其可见光标位于我们要更改的文本块中,我们可以像这样更改文本块QTextEdit
:
myTextEdit
上面的代码工作正常,但它也会向QTextCharFormat
撤消堆栈添加一个undo命令。出于我个人的目的,我希望能够更改text_cursor = myTextEdit.textCursor()
text_cursor.setBlockCharFormat(someNewCharFormat)
的myTextEdit
,而无需向QTextCharFormat
的撤消堆栈添加撤消命令。
我考虑过使用QTextBlock
方法暂时禁用撤消/重做系统,但该方法也会清除撤消堆栈,我不想这样做。我还寻找其他方法来改变撤销/重做系统的行为方式,但我还没有办法让它暂时忽略变化。我只是想对QTextEdit
进行更改,而撤消/重做系统根本没有注册更改。
任何提示或建议表示赞赏。谢谢!
答案 0 :(得分:4)
您必须将其与之前的修改分组。很简单,您必须使用以下代码执行此修改的代码:beginEditBlock
和endEditBlock
。请参阅documentation。
text_cursor = myTextEdit.textCursor()
text_cursor.beginEditBlock()
text_cursor.setCharFormat(someOtherCharFormat) # some previous modification
text_cursor.setBlockCharFormat(someNewCharFormat)
text_cursor.endEditBlock()
通过这种方式,您可以为任何复杂的修改进行撤消堆栈的单次提交。
答案 1 :(得分:1)
您应该使用QSyntaxHighlighter。对其进行扩展并实现highlightBlock
函数,并在其中调用setFormat
来更改格式,而无需进行撤消/重做堆栈。有关更多详细信息,请参见documentation。
如果您觉得QSyntaxHighlighter不是您想要的,则可以使用QTextLayout。它是低级api,它的setAdditionalFormats
功能不会产生任何撤消堆栈。
range1 = QTextLayout.FormatRange()
range1.start = 0
range1.length = 10
range1.format = QTextCharFormat()
# additional ranges here...
textBlock.layout().setAdditionalFormats([range1, ...])
这也用在QSyntaxHighlighter内部。
答案 2 :(得分:0)
joinPreviousBlock()应该可以解决问题:
cursor = self.textCursor()
cursor.joinPreviousEditBlock()
cursor.setPosition(start, QTextCursor.MoveAnchor)
cursor.setPosition(end, QTextCursor.KeepAnchor)
cursor.setCharFormat(fmt)
cursor.endEditBlock()