目標
開發一個結構化的簡單的帶格式的純文字編輯器,要求文檔結構固定。
Qt 框架富文本開發要點
- QTextEdit使用
- QTextCursor接口使用
- QTextDocument使用
QTextEdit
QTextEdit是Qt框架推薦的用於富文本編輯的組建
支持:
- html4語法
- 支持富文本展示和編輯
- 提供了程序化編輯接口
這此實例中僅僅作爲接受文本和展示文本的前端,不深入展開
QTextCursor
QTextCursor是Qt框架提供的用於編程操控富文本文檔的工具,利用QTextCursor在文檔中移動和編輯元素
QTextDocument
是QTextEdit顯示內容的模型
可以用來支持大文檔,完全載入所有文檔,將惰性加載的任務拋給Qt框架。
注意問題
QTextDocument中默認存在rootframe[qtextframe]
由於QTextFrame中默認存在一個QTextBlock如果程序插入的第一個元素不是QTextBlock(insertText())而是QTextFrame(insertFrame())就會造成Frame上方和下方多出冗餘行,可能是qt框架原因,未有解決方案。
解決思路:使用QSyntaxHighlighter進行計算校驗,將冗餘行隱藏。
QTextEdit文章節點跳轉
QTextEdit跳轉採用設置QTextCursor位置的方式
QTextCursor.setPosition(),跳轉的位置通過QTextFrame.firstPosition()取得。
爲了滑動標題到頂部,需要設置QTextEdit.verticalScrollBar.setValue()
QTextEdit的滾動條範圍是按照TextArea的像素大小設置的(目前看來是的)。所以只需要sbar.setValue(sbar.value()+offset)。
offset用textcursor的y()就可以了。
大文檔問題
QTextEdit採用的整體計算方式,渲染大文檔卡頓,還是放棄了。
UndoRedoStacks問題
當使用QTextCursor接口通過QSyntaxHighlighter爲每個TextFrame和TextBlock統一刷格式的時候發現會導致撤銷堆棧失效,不知道爲什麼。