【Qt之QTextDocument】使用及表格顯示富文本解決方案

【Qt之QTextDocument】使用

      • 描述
      • 常用方法及示例
      • 使用QTextList
      • 使用QTextBlock
      • 使用QTextTable
      • 表格顯示富文本
      • 結論

描述

QTextDocument類保存格式化的文本。
QTextDocument是結構化富文本文檔的容器,支持樣式文本和各種文檔元素,如列表、表格、框架和圖像。它們可以用于創建QTextEdit,也可以單獨使用。
每個文檔元素由一個相關的格式對象描述。每個格式對象都被QTextDocuments視為唯一的對象,并且可以通過objectForFormat()傳遞以獲取應用于它的文檔元素。
可以使用QTextCursor以編程方式編輯QTextDocument,并通過遍歷文檔結構來檢查其內容。整個文檔結構都存儲在根框架下的文檔元素層次結構中,可以使用rootFrame()函數找到。或者,如果只想迭代文檔的文本內容,可以使用begin()end()findBlock()檢索文本塊,以便檢查和迭代。
文檔的布局由documentLayout()確定;如果要使用自己的布局邏輯,則可以創建自己的QAbstractTextDocumentLayout子類,并使用setDocumentLayout()設置它。可以通過調用metaInformation()函數獲取文檔的標題和其他元信息。對于通過QTextEdit類向用戶公開的文檔,文檔標題也可以通過QTextEdit::documentTitle()函數獲得。
toPlainText()toHtml()便利函數允許以純文本HTML格式檢索文檔的內容。可以使用find()函數搜索文檔的文本。
可以使用setUndoRedoEnabled()函數控制對文檔執行的操作的撤消/重做。通過undo()redo()插槽可以控制撤消/重做系統;文檔還提供了contentsChanged()undoAvailable()redoAvailable()信號,通知連接的編輯器部件有關撤消/重做系統的狀態。
以下是QTextDocument的撤消/重做操作:

  • 插入或刪除字符。在同一文本塊內插入或刪除的序列被視為單個撤消/重做操作。
  • 插入或刪除文本塊。在單個操作中的插入或刪除序列(例如通過選擇然后刪除文本)被視為單個撤消/重做操作。
  • 文本字符格式更改。
  • 文本塊格式更改。
  • 文本塊組格式更改。

常用方法及示例

  1. void addResource(int type, const QUrl &name, const QVariant &resource) : 添加資源。將資源資源添加到資源緩存中,使用類型和名稱作為標識符。type應該是QTextDocument::ResourceType中的值。
  2. QVariant resource(int type, const QUrl &name) const : 獲取資源。從具有給定名稱的資源返回指定類型的數據。
    富文本引擎調用這個函數來請求沒有直接存儲在QTextDocument中,但仍然與之關聯的數據。例如,圖像通過QTextImageFormat對象的name屬性間接引用。
    資源在文檔內部緩存。如果在緩存中找不到資源,則調用loadResource來嘗試加載該資源。然后loadResource應該使用addResource將資源添加到緩存中。
    QTextDocument* doc = ui->textEdit->document();QImage image(":/images/xxx.png");doc->addResource(QTextDocument::ImageResource, QUrl("qrc:/images/xxx.png"), QVariant(image));// 在文檔中插入圖像QTextCursor cursor(doc);cursor.insertImage(doc->resource(QTextDocument::ImageResource, QUrl("qrc:/images/xxx.png")).value<QImage>());

使用addResource()方法的好處主要包括:

  • 方便管理:該方法允許您將資源(如樣式表、圖像等)添加到文檔中,并將其存儲在內存中,以便在需要時進行訪問。這樣可以使資源的管理更加集中和方便。
  • 提高效率:通過將資源添加到文檔中,您可以在整個文檔中重復使用這些資源,而無需每次都從磁盤或網絡中加載。這可以減少加載時間,提高應用程序的響應速度。
  • 易于維護:使用addResource()方法將資源添加到文檔中,可以使應用程序的資源管理更加清晰和有序。這使得資源的更新和替換變得更加簡單,因為您只需在文檔中修改相應的資源即可。
  • 支持重用:通過將資源添加到文檔中,您可以輕松地在不同的應用程序或文檔中使用相同的資源。這有助于減少重復代碼,提高代碼的可重用性。
  • 支持動態內容:addResource()方法允許您根據需要動態添加和更新資源。這使得在運行時根據用戶交互或其他事件動態更改文檔內容變得更加容易。
  1. QTextBlock begin() const : 返回文檔的第一個文本塊。
  2. QTextBlock end() const : 該函數返回一個塊,用于在迭代文檔時測試文檔的結尾。返回的塊是無效的,并且表示文檔中最后一個塊之后的塊。您可以使用lastBlock()來檢索文檔的最后一個有效塊。
for (QTextBlock it = doc->begin(); it != doc->end(); it = it.next())qDebug().noquote() << it.text();
  1. QTextBlock firstBlock() const : 返回文檔的第一個文本塊內容。
  2. QTextBlock lastBlock() const : 返回文檔的最后一個文本塊內容。
doc->firstBlock().text();
doc->lastBlock().text();
  1. bool QTextDocument::isEmpty() const : 如果文檔為空,返回true;否則返回false。
  2. bool QTextDocument::isRedoAvailable() const : 如果可重做,則返回true;否則返回false。
  3. bool QTextDocument::isUndoAvailable() const : 如果可撤消,則返回true;否則返回false。
  4. QTextBlock QTextDocument::lastBlock() const : 返回文檔的最后一個(有效的)文本塊。
  5. int QTextDocument::lineCount() const : 返回此文檔的行數(如果布局支持此項)。否則,這與塊數相同。
doc->isEmpty();
  1. 枚舉:enum QTextDocument::FindFlag
  2. 獲取枚舉值:flags QTextDocument::FindFlags
    這個enum描述QTextDocumentfind函數可用的選項。這些選項可以從以下列表中進行OR-ed組合:
常量描述解釋
QTextDocument::FindBackward0x00001Search backwards instead of forwards.向后搜索而不是向前搜索。
QTextDocument::FindCaseSensitively0x00002By default find works case insensitive. Specifying this option changes the behaviour to a case sensitive find operation.默認情況下,find不區分大小寫。指定此選項會將行為更改為區分大小寫的查找操作。
QTextDocument::FindWholeWords0x00004Makes find match only complete words.使查找只匹配完整的單詞。
  1. QTextCursor find(const QString &subString, const QTextCursor &cursor, FindFlags options = FindFlags()) const
    查找給定字符串 subStringcursor 所代表的文本中的位置,返回一個文本光標,該光標指向找到的文本。如果未找到匹配的字符串,則返回一個空的光標。可以設置查找選項 options,例如大小寫敏感、全字匹配等。
  2. QTextCursor find(const QString &subString, int position = 0, FindFlags options = FindFlags()) const
    查找給定字符串 subString 在當前文本中的指定位置 position 處開始查找,返回一個文本光標,該光標指向找到的文本。如果未找到匹配的字符串,則返回一個空的光標。可以設置查找選項 options,例如大小寫敏感、全字匹配等。
  3. QTextCursor find(const QRegExp &expr, int from = 0, FindFlags options = FindFlags()) const
    使用正則表達式 expr 在當前文本中的指定位置 from 處開始查找,返回一個文本光標,該光標指向找到的文本。如果未找到匹配的字符串,則返回一個空的光標。可以設置查找選項 options,例如大小寫敏感、全字匹配等。
  4. QTextCursor find(const QRegExp &expr, const QTextCursor &cursor, FindFlags options = FindFlags()) const
    使用正則表達式 exprcursor 所代表的文本中的位置查找,返回一個文本光標,該光標指向找到的文本。如果未找到匹配的字符串,則返回一個空的光標。可以設置查找選項 options,例如大小寫敏感、全字匹配等。
  5. QTextCursor find(const QRegularExpression &expr, int from = 0, FindFlags options = FindFlags()) const
    使用正則表達式 expr 在當前文本中的指定位置 from 處開始查找,返回一個文本光標,該光標指向找到的文本。如果未找到匹配的字符串,則返回一個空的光標。可以設置查找選項 options,例如大小寫敏感、全字匹配等。
  6. QTextCursor find(const QRegularExpression &expr, const QTextCursor &cursor, FindFlags options = FindFlags()) const
    使用正則表達式 exprcursor 所代表的文本中的位置查找,返回一個文本光標,該光標指向找到的文本。如果未找到匹配的字符串,則返回一個空的光標。可以設置查找選項 options,例如大小寫敏感、全字匹配等。
    QTextDocument* pDoc = ui->textEdit->document();pDoc->setPlainText("helloworld");QTextCursor cursor = ui->textEdit->textCursor();cursor.insertText("\n");cursor.insertText("earth");cursor.insertText("\n");cursor.insertText("sun");// 輸出查找到的位置,從后往前查找qDebug() << pDoc->find(QRegularExpression("ear"), cursor.position(), QTextDocument::FindBackward).position();// 以下查找到會自動選擇匹配到的ui->textEdit->find("ear", QTextDocument::FindBackward);

在這里插入圖片描述
在這里插入圖片描述

  1. 枚舉:enum QTextDocument::MetaInformation
    這個枚舉描述了可以添加到文檔中的不同類型的元信息。
常量描述解釋
QTextDocument::DocumentTitle0The title of the document.文件的標題。
QTextDocument::DocumentUrl1The url of the document. The loadResource() function uses this url as the base when loading relative resources.文檔的url。loadResource()函數在加載相關資源時使用此url作為基。
  1. QString metaInformation(MetaInformation info) const
  2. void setMetaInformation(MetaInformation info, const QString &string) : 將由info指定的類型的文檔元信息設置為給定的字符串。
    pDoc->setMetaInformation(QTextDocument::DocumentTitle, "helloworld");qDebug() << pDoc->metaInformation(QTextDocument::DocumentTitle);

在這里插入圖片描述
23. 獲取文本塊數目、行數、是否編輯、是否為空等操作

    // 文本塊數目qDebug() << pDoc->blockCount();// 行數qDebug() << pDoc->lineCount();// 是否是空qDebug() << pDoc->isEmpty();// 是否編輯qDebug() << pDoc->isModified();// 是否執行RedoqDebug() << pDoc->isRedoAvailable();// 是否執行UndoqDebug() << pDoc->isUndoAvailable();// Undo和Redo是否使能qDebug() << pDoc->isUndoRedoEnabled();

在這里插入圖片描述
24. void setHtml(const QString &html)

pDoc->setHtml("<p style='color:#ff0000;'>helloworld</p>");

在這里插入圖片描述
25. void setPlainText(const QString &text)
使用此方法,會將textEdit.setTextColor()方法設置的文本顏色失效。

pDoc->setPlainText("helloworld");

在這里插入圖片描述

使用QTextList

    QTextDocument* pDoc = ui->textEdit->document();pDoc->setPlainText("helloworld\n");QTextCursor cursor(pDoc);QTextListFormat listFormat;listFormat.setStyle(QTextListFormat::ListDecimal); // 使用有序列表QTextList * pList = cursor.insertList(listFormat);cursor.insertText("Item 1\n");cursor.insertText("Item 2\n");cursor.insertText("Item 3");QTextList* list = cursor.currentList();qDebug() << list->count();if (list) {QTextBlock currentItem = list->item(0);// 處理列表中的第一個項QString text = currentItem.text();qDebug() << text;}

在這里插入圖片描述

使用QTextBlock

    QTextDocument* pDoc = ui->textEdit->document();QTextCursor cursor(pDoc);cursor.insertText("\n");cursor.insertText("Hello, World!");QTextBlock currentBlock = pDoc->firstBlock();while (currentBlock.isValid()) {QString text = currentBlock.text();// 處理當前段落的文本內容qDebug() << text;currentBlock = currentBlock.next();}

在這里插入圖片描述
在這里插入圖片描述

使用QTextTable

    QTextDocument* pDoc = ui->textEdit->document();// pDoc->setPlainText("helloworld\n");QTextCursor cursor(pDoc);QTextTableFormat tableFormat;tableFormat.setBorder(1);tableFormat.setCellPadding(5);tableFormat.setAlignment(Qt::AlignCenter);cursor.insertTable(3, 2, tableFormat);QTextTable* table = cursor.currentTable();if (table) {for (int row = 0; row < table->rows(); ++row) {for (int col = 0; col < table->columns(); ++col) {QTextTableCell cell = table->cellAt(row, col);QTextCursor cellCursor = cell.firstCursorPosition();cellCursor.insertText(QString("Row %1, Col %2").arg(row).arg(col));}}}

在這里插入圖片描述

表格顯示富文本

QTableWidget是Qt框架提供的一個用于顯示表格數據的控件。然而,QTableWidget本身并不直接支持富文本(rich text)的顯示。如果需要在QTableWidget中顯示富文本,一種方法是使用QTableWidgetItemsetData方法,將富文本作為自定義數據存儲在表格中,然后在單元格的渲染過程中使用自定義的QStyledItemDelegate 來顯示這些數據。

#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QTextDocument>
#include <QTextCharFormat>
#include <QTextCursor>
#include <QStyledItemDelegate>class RichTextDelegate : public QStyledItemDelegate {
public:explicit RichTextDelegate(QTableWidget* pTW){m_pTW = pTW;}
public:void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {QTableWidgetItem *item = m_pTW->item(index.row(), index.column());if (item) {QTextDocument doc;doc.setHtml(item->data(Qt::UserRole).toString());doc.drawContents(painter);}}private:QTableWidget*   m_pTW;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);QTableWidget table;table.setColumnCount(1);table.setRowCount(3);table.setItemDelegateForColumn(0, new RichTextDelegate(&table));// 添加富文本數據到表格中QTableWidgetItem *item1 = new QTableWidgetItem;item1->setData(Qt::UserRole, "<h1>標題1</h1><p>段落1</p>");table.setItem(0, 0, item1);QTableWidgetItem *item2 = new QTableWidgetItem;item2->setData(Qt::UserRole, "<h1>標題2</h1><p>段落2</p>");table.setItem(1, 0, item2);table.show();return app.exec();
}
  • 創建了一個自定義的RichTextDelegate類,繼承自QTableWidgetItemDelegate
  • paint方法中,檢查每個表格項的數據,如果存在自定義的富文本數據(存儲在Qt::UserRole),則使用QTextDocument來渲染這些數據。
  • 將這個自定義委托設置為表格的第一列的代理。

在這里插入圖片描述

結論

只要未來可期,今天就值得欣喜

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CANopen協議【SDO】

SDO&#xff1a; SDO是讀寫單個寄存器。主要用于配置伺服驅動器參數。 1 收發功能&#xff1a; //public unsafe struct VCI_CAN_OBJ //CAN數據幀 【單幀對象】//{// public uint ID;// 幀ID。 【11bit】數據右對齊。 詳情請參照&#xff1a; 《8.附件1&#xff1…

Python 模塊

目錄 模塊 6.1. 模塊詳解 6.1.1. 以腳本方式執行模塊 6.1.2. 模塊搜索路徑 6.1.3. “已編譯的” Python 文件 6.2. 標準模塊 6.3. dir() 函數 6.4. 包 6.4.1. 從包中導入 * 6.4.2. 相對導入 6.4.3. 多目錄中的包 模塊 退出 Python 解釋器后&#xff0c;再次進入時&a…

手把手教你安裝 Visual Studio 2022 及其簡單使用

軟件下載 打開 Visual Studio 官網&#xff0c;個人選擇免費的Community社區版就夠用了。 軟件安裝 雙擊運行安裝程序&#xff1a; 點擊繼續 即可&#xff1a; 等待加載完成&#xff1a; 可以看到 Visual Studio 2022 對應不同的開發需求提供了若干工作負載&#xff0c;這里以…

?3ds Max插件CG MAGIC圖形板塊為您提升線條效率!

?通過3ds Max軟件進行繪圖操作時&#xff0c;大多絆住各位設計師們作圖速度的往往都是一些細微的瑣事&#xff0c;重復一變一變的調整修改等問題。 今天說到這個繪圖線條來回調整解決方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作為一款智能化的輔助插件&#xff0c;致力于…

flutter編譯和構建鴻蒙應用程序(windows環境)

flutter編譯和構建鴻蒙應用程序&#xff08;windows環境&#xff09; 問題背景 針對 OpenHarmony 的 Flutter 版本已經開源&#xff0c;參考 https://gitee.com/openharmony-sig/flutter_flutter。 本文為實踐該流程&#xff0c;實現flutter打包鴻蒙hap包的流程。目前流程已經…

flink的java.lang.IllegalStateException: Buffer pool is destroyed 異常

背景 最近flink的在線應用出現錯誤java.lang.IllegalStateException: Buffer pool is destroyed&#xff0c;本文記錄下這個錯誤的原因 錯誤原因 詳細的日志堆棧如下: Caused by: java.lang.IllegalStateException: Buffer pool is destroyed. at org.apache.flink.runtime…

Ps:畫筆工具的基本操作

畫筆工具 Brush Tool是 Ps 中最常用的工具&#xff0c;廣泛地用于繪畫與修飾工作。 雖然多數操作可在畫筆工具的工具選項欄中選擇執行&#xff0c;但是如果能記住相應的快捷鍵可大大提高工作效率。 熟練掌握畫筆工具的操作對于使用其他工具也非常有益&#xff0c;因為 Ps 中許多…

CSS-長度單位篇

px&#xff1a;像素em&#xff1a;相對元素font-size的倍數rem&#xff1a;相對根字體大小&#xff0c;html標簽就是根%&#xff1a;相對父元素計算 注意&#xff1a;CSS中設置長度&#xff0c;必須加單位&#xff0c;否則樣式無效&#xff01;

Maven - 打包之爭:Jar vs. Shade vs. Assembly

文章目錄 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文檔 Shade 打包方式_maven-shade-pluginOverview使用將部分jar包添加或排除將依賴jar包內部資源添加或排除自動將所有不使用的類排除將依賴的類重命名并打包進來 &#xff08;隔離方案&#xff09;修改包的后綴…

ElasticSearch之cat component templates API

命令樣例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/component_templates?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; name …

Qt/QML編程學習之心得:一個QML工程的學習筆記(十)

前言: 到底什么是Qt Quick呢?因為Qt Quick是Qt新引入的,Qt Quick由Qt Quick模塊提供,它是一個編寫QML應用的標準庫。Qt Quick模塊提供了兩種接口:使用QML語言創建應用的QML接口和使用C++語言擴展QML的C++接口。使用Qt Quick模塊,設計人員和開發人員可以輕松地構建流暢的…

【自主探索】基于 frontier_exploration 的單個機器人自主探索建圖

文章目錄 一、概述1、功能2、要求 二、使用方法1、用于運行演示2、用于開發人員2.1. 探索無/地圖數據2.2. 使用 /map 數據進行探索 三、提供的組件1、explore_client1.1. 調用的操作1.2. 訂閱主題1.3. 發布主題 2、explore_server2.1. 提供的操作2.2. 調用的操作2.3. 調用的服務…

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷6

1、將一個空塑料袋與一個裝滿空氣的塑料袋放到秤上稱重。在兩個塑料袋本身完全一樣的情況下&#xff0c;得出的結果會是 A、空塑料袋更重 B、裝滿空氣的塑料袋更重 C、兩個塑料袋一樣重 D、無法判斷 答案&#xff1a;C 2、全球變暖帶來的一個主要影響就是海平面的上升。造…

web前端開發基礎----標準流布局和非標準流布局

1&#xff0c;標準流布局 標準流&#xff0c;也稱文檔流或普通流&#xff0c;是所有元素默認的布局方式。 在標準流中&#xff0c;元素按照其在 HTML 中出現的順序&#xff0c;自上而下依次排列&#xff0c;并占據其父容器內的可用空間。 標準流中的元素按照其自然尺寸和位置進…

uniapp實現多時間段設置

功能說明&#xff1a; 1 點擊新增時間&#xff0c;出現一個默認時間段模板&#xff0c;不能提交 2 點擊“新增時間文本”&#xff0c;彈出彈窗&#xff0c;選擇時間&#xff0c;不允許開始時間和結束時間同時為00:00&#xff0c; <view class"item_cont"> …

TCP/IP協議:最流行的電子郵件協議SMTP(簡單郵件傳輸協議)詳解

SMTP 是一種電子郵件協議&#xff0c;用于通過互聯網從一個電子郵件帳戶向另一個電子郵件帳戶發送電子郵件。它是TCP/IP協議應用層的一部分。作為一種電子郵件協議&#xff0c;它建立了不同電子郵件客戶端和帳戶之間輕松信息交換的規則。這樣&#xff0c;簡單郵件傳輸協議就可以…

求最小的起始正整數

題目描述 給你一個整數數組 nums 。你可以選定任意的 正數 startValue 作為初始值。 你需要從左到右遍歷 nums 數組&#xff0c;并將 startValue 依次累加上 nums 數組中的值。 請你在確保累加和始終大于等于 1 的前提下&#xff0c;選出一個最小的 正數 作為 startValue 。…

【Rust 日報】2023-11-23 - egui 0.24 發布

項目 - egui 0.24 發布 egui 是一個易于使用的 Rust GUI 庫&#xff0c;支持在本地環境和瀏覽器中運行。 egui 0.24 的重要新特性是多視窗功能。在支持的后端上&#xff08;如eframe&#xff09;&#xff0c;用戶可以利用全新的 viewport API 同時生成多個本機窗口。 此外&…

Git 的基本概念和使用方式。

Git 是一個開源的分布式版本控制系統&#xff0c;它可以記錄代碼的修改歷史&#xff0c;跟蹤文件的版本變化&#xff0c;并支持多人協同開發。Git 的基本概念包括&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;存放代碼和版本歷史記錄的地方。 2. 分支…

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用 HarmonyOS,作為一款全場景分布式操作系統,為了推動更廣泛的應用開發,采用了一種先進而靈活的編程語言——ArkTS。ArkTS是在TypeScript(TS)的基礎上發展而來,為HarmonyOS提供了豐富的應用開發工具,使開…