Qt 富文字處理(二)

2021-05-24 00:45:30 字數 2744 閱讀 1128

文件元素

富文字文件通常包括一些通用的元素,例如段落、框架、**和列表。這些在 qtextdocument 類中分別使用 qtextblock,qtextframe,qtexttable 和 qtextlist 描述。不同於文件的其他元素,使用一種特殊的文字片段描述,這使得可以同普通文字混排。

文件的基本構建單位是 qtextblock 和 qtextframe。塊本身就包含文字片段(qtextfragment),但是這不會直接影響到高層次的文件結構。

能夠對其他文件元素分組的是 qtextobject 的子類。這些元素被分為兩種型別:對文字塊分組的是 qtextblockgroup 的子類,對文字片段和其他元素分組的是 qtextframe 的子類。

文字塊由 qtextblock 類提供。

文字塊可以將具有不同字元樣式的文字分組,用於表示文件段落。典型的文字塊具有若干個不同樣式的文字片段。當文字插入文件時,文字塊被建立。在對文件進行編輯時,會增加更多的文字塊。在塊中,文件通過分割、合併、刪除片段,有效地表現不同樣式的文字。

乙個文字塊中的片段可以通過 qtextblock::iterator 遍歷:

qtextblock::iterator it; 

for (it = currentblock.begin(); !(it.atend()); ++it)  

}

文字塊也可以用來表現列表項。因此,塊能夠在它們自己的字元樣式包含塊級樣式資訊,例如列表項的符號等。塊自己的樣式由 qtextblockformat 描述,包括文字對齊方式,縮排和背景色。

雖然乙個給定的文件可能包含複雜的結構,但是只要我們有乙個文件中的文字塊,我們就可以通過這個文字塊對文件中所有文字塊以編寫順序進行導航:

qtextblock currentblock = textdocument->begin(); 

while (currentblock.isvalid())  

當你需要匯出文件中所有富文字內容時,這個方法就十分有用。因為它會忽略框架、**以及其他文件結構。

qtextblock 提供了比較運算子使操作更為簡便:operator==() 和 operator!=() 用於比較兩個塊是否相同;operator<() 用於判斷哪乙個塊在文件中的出現順序靠前。

框架由 qtextframe 類提供。

文字框架用於組織文字塊和子框架。這是一種比段落更大一級的文件結構。框架的格式決定它如何被顯示和在頁面中的位置。框架不是被插入文字流,就是浮在頁面的左側或者右側。每乙個文件都有乙個根框架,包含了文件的所有結構。因此,除根框架之外,所有框架都有父框架。

既然文字塊用於分割文件結構,那麼,每乙個框架都將至少包含乙個文字塊,零個或者多個子框架。我們可以通過 qtextframe::iterator 來遍歷所有子元素:

qtextframe::iterator it; 

for (it = frame->begin(); !(it.atend()); ++it)  

注意,上面的**,遍歷器同時選出了文字塊和框架,因此需要判斷究竟是哪種元素。這能夠讓我們乙個框架乙個框架地導航文件,同時在需要的時候能夠很方便地取出文字塊。

qtextblock::iterator 和 qtextframe::iterator 兩個類能夠互補地取出文件中所需的結構。

**由 qtexttable 類提供。

**是乙個分布在行和列的單元的集合。每乙個**單元都是乙個文件元素,擁有自己的字元樣式,能夠包含其他元素,例如框架和文字塊。在**構建,或者增加行或者列時,**單元被自動建立。**單元也可以在兩個**之間移動。

qtexttable 是 qtextframe 的子類,因此**在文件中被作為框架處理。如果我們需要處理文件中的每乙個框架,我們需要對它們進行區分,從而分別處理:

qtextframe::iterator it; 

for (it = frame->begin(); !(it.atend()); ++it)  else

if (childblock.isvalid()) 

processblock(frameelement, childblock); 

}

對於**中已存在的單元,可以通過行和列進行遍歷:

for (int row = 0; row < table->rows(); ++row)  

}

列表由 qtextlist 類提供。

列表是一系列按照一般方法格式化的文字塊,同時有乙個列表的修飾,例如乙個點和列表項。列表可以巢狀。如果列**式指定了非零縮排,列表就會有一定的縮排。

我們可以通過列表索引指定每乙個列表項:

for (int index = 0; index < list->count(); ++index)  

qtextlist 實際上是 qtextblockgroup 的子類,因此,它並不是將列表項當做子元素,而是提供另外的方法管理它們。這意味著,當我們遍歷文件的所有文字塊時,有可能它是乙個列表中的一項。我們應當使用下面的**進行區分:

qtextframe::iterator it; 

for (it = frame->begin(); !(it.atend()); ++it)  

} } 

在 qtextdocument 中,影象當做乙個文字片段,這個文字通過 qt 資源機制指向的外部鏈結。影象通過游標介面建立,通過改變影象文字片段的樣式進行修改:

if (fragment.isvalid())  

}

表示影象的片段可以通過遍歷包含影象的文字塊的所有片段獲得。

Qt 富文字處理(二)

富文字文件通常包括一些通用的元素,例如段落 框架 和列表。這些在 qtextdocument 類中分別使用 qtextblock,qtextframe,qtexttable 和 qtextlist 描述。不同於文件的其他元素,使用一種特殊的文字片段描述,這使得可以同普通文字混排。文件的基本構建單位是...

富文字處理

include mainwindow.h include ui mainwindow.h include include mainwindow mainwindow qwidget parent qmainwindow parent ui new ui mainwindow mainwindow m...

富文字處理支援tabel

graceui rich text 加強工具 link graceui.hcoder.net author 5213606 qq.com 深海 正則 var gracerichtextreg 批量替換的樣式 根據專案需求自行設定 var grt div 樣式 div line height 2em ...