2014-11-24 83 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