2014-11-24 154 views
1

我正在寻找一种方法来更改的QTextBlockQTextCharFormat而不触发添加撤消命令。让我解释一下:更改为QTextEdit而不添加撤消命令到撤消堆栈

QTextBlockQTextCharFormat可以很容易地通过使用QTextCursor::setBlockCharFormat()方法进行更改。假设我们有一个QTextEdit称为myTextEdit它的可见光标是我们要改变文本块中,我们可以改变文本块的QTextCharFormat像这样:

text_cursor = myTextEdit.textCursor() 
text_cursor.setBlockCharFormat(someNewCharFormat) 

上面的代码工作正常,但它也将增加一个撤销命令到myTextEdit撤销堆栈。出于我自己的目的,我希望能够更改QTextCharFormatQTextBlock而不添加撤消命令到QTextEdit的撤消堆栈。

我认为使用QTextDocument::setUndoRedoEnabled()方法暂时禁用了撤消/恢复系统,但该方法也清除了我不想做的撤消堆栈。我也在寻找其他方法来改变undo/redo系统的行为方式,但是我还没有找到一种方法让它暂时忽略更改。我只是想对QTextEdit进行更改,而没有撤销/重做系统注册更改。

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

+1

我想你可能会走运,看看[这个qt-interest线程](http://www.archivum.info/[email protected]/2006-10/01204/QTextEdit-temporary-undo -suppression.html)(这有点旧,但它总结的问题相当好)。 – ekhumoro 2014-11-25 00:31:59

回答

3

您必须将其与之前的修改进行分组。很简单,您必须将代码修改为:beginEditBlockendEditBlock。见documentation

text_cursor = myTextEdit.textCursor() 
text_cursor.beginEditBlock() 
text_cursor.setCharFormat(someOtherCharFormat) # some previous modification 
text_cursor.setBlockCharFormat(someNewCharFormat) 
text_cursor.endEditBlock() 

这样你就可以对任何复杂的修改进行一次撤销堆栈提交。

+1

嗨马雷克。感谢您的建议!不幸的是,这个解决方案没有完成我所需要的。我真的需要那里没有任何撤消命令。我需要的原因是我试图扩展撤消/重做系统来跟踪和更改整个程序的属性,默认情况下它不跟踪。这意味着,当某个操作被撤消时,我正在执行其他代码,这些代码可能被认为是撤消操作的一部分。在我的情况下,setBlockCharFormat()方法将作为** undo的一部分运行**,因此不应该向堆栈添加undo命令。 – user3483225 2014-11-25 04:31:05

+0

所以尝试'撤消'然后在编辑块'重做'里面,而不是你的改变。 – 2014-11-25 09:11:37