描述
Scribe
框架提供了一組類,用于讀取和操作結構化的富文本文檔。與Qt
中以前的富文本支持不同,新的類集中在QTextDocument
類上,而不是原始文本信息。這使開發者能夠創建和修改結構化的富文本文檔,而不必準備中間標記格式的內容。
文檔中的信息可以通過兩個互補的接口訪問:基于光標的接口用于編輯
,只讀分層接口提供文檔結構
的高層次概述。基于光標的接口的主要優點是,可以使用模擬用戶與編輯器交互的操作編輯文本,而不會丟失文檔的基礎結構。只讀分層接口在執行搜索和文檔導出等操作時最有用。
在Qt
中,富文本處理可以使用QTextEdit
和QTextBrowser
實現。這兩個類都繼承自QAbstractScrollArea
類,提供了文本的顯示和編輯功能。
QTextEdit
提供了類似于一個文本編輯器的界面,可以進行編輯和顯示富文本。需要注意的是,QTextEdit
可以顯示圖片和嵌入式對象,但不能直接播放音頻和視頻。
QTextBrowser
提供了一個只讀的文本顯示界面,可以用于顯示富文本內容。與QTextEdit
不同,QTextBrowse
r只支持顯示圖片,不支持嵌入式對象。
在Qt
中實現富文本處理的流程:
-
創建
QTextEdit
或QTextBrowser
對象,設置其屬性和初始文本內容; -
使用
QTextCursor
操作文本內容,如插入文本、設置字體和顏色、插入圖片等; -
將富文本內容保存到文件或使用
QClipboard
復制到剪貼板中; -
在需要的位置顯示富文本內容,如在某個對話框中、在網頁中等。
示例代碼實現在QTextEdit
中插入一張圖片和設置不同的字體和顏色:
注意:在使用插入圖片功能時,需要將圖片資源添加到Qt
項目中,并使用相應的路徑引用。
ui->textEdit->setPlainText("Hello World!"); //設置初始文本內容ui->textEdit->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); //設置文本可選中屬性為falseQTextCursor cursor = ui->textEdit->textCursor(); //獲取文本光標cursor.insertImage(":/images/image.png"); //插入圖片QFont font("Arial", 16, QFont::Bold); //設置字體cursor.movePosition(QTextCursor::End); //將光標移動到文本結尾QTextCharFormat format;format.setFont(font);cursor.insertText("\nQt is great!", format); //插入文本并設置字體QColor color(Qt::red); //設置顏色cursor.movePosition(QTextCursor::Start); //將光標移動到文本開頭cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 5); //選中第一個單詞
// cursor.setCharFormat(QTextCharFormat()); //清除之前的格式
// cursor.setCharFormat(QTextCharFormat(), QTextCharFormat::ForegroundBrush); //設置前景色ui->textEdit->setTextCursor(cursor);
富文本相關類
Qt提供了大量的類來解析、渲染、操作和編輯富文本。
模塊 | 描述 | 解釋 |
---|---|---|
QAbstractTextDocumentLayout | Abstract base class used to implement custom layouts for QTextDocuments | 用于為QTextDocuments實現自定義布局的抽象基類 |
QFont | Specifies a font used for drawing text | 指定用于繪制文本的字體 |
QSyntaxHighlighter | Allows you to define syntax highlighting rules, and in addition you can use the class to query a document’s current formatting or user data | 允許定義語法高亮規則,并且還可以使用該類查詢文檔的當前格式或用戶數據 |
QTextCursor | Offers an API to access and modify QTextDocuments | 提供訪問和修改QTextDocuments的API |
QTextDocument | Holds formatted text | 維護格式化的文本 |
QTextDocumentFragment | Represents a piece of formatted text from a QTextDocument | 表示來自QTextDocument的格式化文本片段 |
QTextDocumentWriter | Format-independent interface for writing a QTextDocument to files or other devices | 用于將QTextDocument寫入文件或其他設備的格式無關接口 |
QTextBlockFormat | Formatting information for blocks of text in a QTextDocument | QTextDocument中文本塊的格式信息 |
QTextCharFormat | Formatting information for characters in a QTextDocument | QTextDocument中字符的格式信息 |
QTextFormat | Formatting information for a QTextDocument | QTextDocument的格式信息 |
QTextFrameFormat | Formatting information for frames in a QTextDocument | QTextDocument中框架的格式信息 |
QTextImageFormat | Formatting information for images in a QTextDocument | QTextDocument中圖像的格式信息 |
QTextLength | Encapsulates the different types of length used in a QTextDocument | 封裝在QTextDocument中使用的不同類型的長度 |
QTextListFormat | Formatting information for lists in a QTextDocument | QTextDocument中列表的格式信息 |
QTextTableCellFormat | Formatting information for table cells in a QTextDocument | QTextDocument中表單元格的格式信息 |
QTextTableFormat | Formatting information for tables in a QTextDocument | QTextDocument中表格的格式信息 |
QTextInlineObject | Represents an inline object in a QAbstractTextDocumentLayout and its implementations | 表示QAbstractTextDocumentLayout及其實現中的內聯對象 |
QTextLayout | Used to lay out and render text | 用于布局和呈現文本 |
QTextLine | Represents a line of text inside a QTextLayout | 表示QTextLayout內的一行文本 |
QTextList | Decorated list of items in a QTextDocument | QTextDocument中裝飾了的列表項 |
QTextBlock | Container for text fragments in a QTextDocument | QTextDocument中文本片段的容器 |
QTextBlockGroup | Container for text blocks within a QTextDocument | QTextDocument中文本塊的容器 |
QTextBlockUserData | Used to associate custom data with blocks of text | 用于將自定義數據與文本塊關聯 |
QTextFragment | Holds a piece of text in a QTextDocument with a single QTextCharFormat | 在QTextDocument中保留具有單個QTextCharFormat的文本片段 |
QTextFrame | Represents a frame in a QTextDocument | 表示QTextDocument中的框架 |
QTextObject | Base class for different kinds of objects that can group parts of a QTextDocument together | 不同類型的對象的基類,這些對象可以將QTextDocument的部分組合在一起 |
QTextFrame::iterator | Iterator for reading the contents of a QTextFrame | 用于讀取QTextFrame內容的迭代器 |
QTextBlock::iterator | QTextBlock::iterator class provides an iterator for reading the contents of a QTextBlock | QTextBlock::iterator類為讀取QTextBlock內容提供迭代器 |
QTextOption | Description of general rich text properties | 通用富文本屬性的描述 |
QTextTable | Represents a table in a QTextDocument | 表示QTextDocument中的表格 |
QTextTableCell | Represents the properties of a cell in a QTextTable | 表示QTextTable中單元格的屬性 |
QPlainTextDocumentLayout | Implements a plain text layout for QTextDocument | 為QTextDocument實現純文本布局 |
QPlainTextEdit | Widget that is used to edit and display plain text | 用于編輯和顯示純文本的小部件 |
QTextBrowser | Rich text browser with hypertext navigation | 富文本瀏覽器,帶有超文本導航 |
QTextEdit | Widget that is used to edit and display both plain and rich text | 用于編輯和顯示純文本和富文本的小部件 |
QTextEdit的cursor和document關系圖
Documen框架圖
QTextFrame
QTextDocument* doc = ui->textEdit->document();QTextFrame* frame = doc->rootFrame();QTextFrameFormat format;format.setBorderBrush(Qt::red);format.setBorder(3);frame->setFrameFormat(format);
運行程序,發現只可以在紅色邊框內編輯。
使用光標類對象,在根框架中添加一個子框架。
QTextFrameFormat frameFormat;frameFormat.setBackground(Qt::lightGray);frameFormat.setMargin(10);frameFormat.setPadding(10);frameFormat.setBorder(2);frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);QTextCursor cursor = ui->textEdit->textCursor();cursor.insertFrame(frameFormat);
顯示如下:
文本塊
綁定信號和槽,輸出文本塊,以下只可獲取文本塊,不可獲取frame的內容。
void MainWindow::on_action_frame_triggered()
{QTextDocument* doc = ui->textEdit->document();QTextFrame* frame = doc->rootFrame();QTextFrame::iterator it = frame->begin();while (!it.atEnd()) {QTextFrame* childFrame = it.currentFrame();QTextBlock childBlock = it.currentBlock();if(childFrame){qDebug() << "frame";}else if(childBlock.isValid()){qDebug() << "block :" << childBlock.text();}++it;}
}
顯示如下:
獲取frame的內容:
void MainWindow::on_actionframeText_triggered()
{QTextDocument* doc = ui->textEdit->document();QTextBlock block = doc->firstBlock();for (int var = 0; var < doc->blockCount(); ++var) {qDebug() << block.text();block = block.next();}}
界面及結果:
QTextBlockFormat和QTextCharFormat
QTextBlockFormat:設置對齊方式、縮進等格式;
QTextCharFormat:設置字體、顏色、下劃線等格式。
QTextBlockFormat blockFormat;blockFormat.setAlignment(Qt::AlignCenter);cursor.insertBlock(blockFormat);QTextCharFormat charFormat;charFormat.setBackground(Qt::lightGray);charFormat.setForeground(Qt::blue);charFormat.setFont(QFont("宋體", 12, QFont::Bold, true));charFormat.setFontUnderline(true);cursor.setCharFormat(charFormat);cursor.insertText("helloworld");
效果如下:
插入表格、列表、圖片
表格相關類:
QTextTableFormat
、QTextTableCellFormat
、 QTextTable
QTextTable *insertTable(int rows, int cols, const QTextTableFormat &format);QTextTable *insertTable(int rows, int cols);QTextTable *currentTable() const;
示例:
QTextTableFormat tableFormat;tableFormat.setCellSpacing(2);tableFormat.setCellPadding(10);cursor.insertTable(2, 2, tableFormat);
列表相關類:
QTextListFormat
、QTextList
QTextList *insertList(const QTextListFormat &format);QTextList *insertList(QTextListFormat::Style style);QTextList *createList(const QTextListFormat &format);QTextList *createList(QTextListFormat::Style style);QTextList *currentList() const;
示例:
QTextListFormat listFormat;listFormat.setStyle(QTextListFormat::ListDecimal);cursor.insertList(listFormat);
圖片相關類:
QTextImageFormat
、
void insertImage(const QTextImageFormat &format, QTextFrameFormat::Position alignment);void insertImage(const QTextImageFormat &format);void insertImage(const QString &name);void insertImage(const QImage &image, const QString &name = QString());
查找
查找到后,可以定位字符串所在的行和列的編號。
qDebug() << ui->textEdit->find("hello world", QTextDocument::FindBackward);ui->textEdit->textCursor().blockNumber();
ui->textEdit->textCursor().columnNumber();