在不向撤消堆栈添加撤消命令的情况下更改QTextEdit

时间:2014-11-24 20:07:59

标签: qt pyside qtextedit

我正在寻找一种方法来更改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进行更改,而撤消/重做系统根本没有注册更改。

任何提示或建议表示赞赏。谢谢!

3 个答案:

答案 0 :(得分:4)

您必须将其与之前的修改分组。很简单,您必须使用以下代码执行此修改的代码:beginEditBlockendEditBlock。请参阅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()