一、QTextDocument
QTextDocument 是 Qt 中用于處理富文本文檔的核心類,支持文本格式、圖片、表格等復雜內容。
1. QTextDocument 入門
1.1 基本概念
QTextDocument 是 Qt 中用于處理富文本內容的核心類,它提供了:
-
結構化文本存儲(段落、列表、表格等)
-
文本格式支持(字體、顏色、對齊等)
-
文檔布局管理
-
撤銷/重做功能
-
HTML/純文本/Markdown 支持
1.2 創建方式
// 方式1:直接創建
QTextDocument *doc = new QTextDocument(parent);// 方式2:從QTextEdit獲取
QTextEdit *editor = new QTextEdit;
QTextDocument *doc = editor->document();// 方式3:從內容創建
QTextDocument *doc = new QTextDocument("初始內容", parent);
2. 核心屬性表
屬性 | 類型 | 訪問 | 描述 |
---|---|---|---|
baseUrl | QUrl | 讀寫 | 解析相對URL的基礎地址 |
blockCount | int | 只讀 | 文檔中的文本塊數量 |
characterCount | int | 只讀 | 文檔字符總數 |
defaultFont | QFont | 讀寫 | 默認字體設置 |
documentMargin | qreal | 讀寫 | 文檔頁邊距 |
indentWidth | qreal | 讀寫 | 縮進寬度 |
isEmpty | bool | 只讀 | 是否為空文檔 |
modified | bool | 讀寫 | 文檔是否被修改 |
pageSize | QSizeF | 讀寫 | 頁面尺寸 |
textWidth | qreal | 讀寫 | 文本寬度限制 |
title | QString | 讀寫 | 文檔標題 |
undoRedoEnabled | bool | 讀寫 | 是否啟用撤銷/重做 |
3. 重要方法分類
3.1 內容操作
// 設置/獲取內容
void setPlainText(const QString &text)
QString toPlainText() const
void setHtml(const QString &html)
QString toHtml() const
void setMarkdown(const QString &markdown)
QString toMarkdown() const// 清空文檔
void clear()
3.2 文本查找
QTextCursor find(const QString &subString, const QTextCursor &from = QTextCursor(),FindFlags flags = FindFlags()) constQTextCursor find(const QRegularExpression &expr,const QTextCursor &from = QTextCursor(),FindFlags flags = FindFlags()) const
3.3 撤銷/重做
void undo()
void redo()
void clearUndoRedoStacks()
bool isUndoAvailable() const
bool isRedoAvailable() const
3.4 文檔結構
// 獲取文檔部分
QTextBlock firstBlock() const
QTextBlock lastBlock() const
QTextFrame *rootFrame() const// 迭代器
QTextBlock begin() const
QTextBlock end() const
3.5 資源管理
QVariant loadResource(int type, const QUrl &name)
void addResource(int type, const QUrl &name, const QVariant &resource)
3.6 打印輸出
void drawContents(QPainter *painter, const QRectF &rect = QRectF())
void print(QPagedPaintDevice *printer) const
4. 信號系統
信號 | 描述 |
---|---|
contentsChanged() | 文檔內容發生改變時觸發 |
contentsChange(int from, int charsRemoved, int charsAdded) | 詳細內容變化信號 |
undoAvailable(bool available) | 撤銷狀態變化 |
redoAvailable(bool available) | 重做狀態變化 |
modificationChanged(bool changed) | 修改狀態變化 |
blockCountChanged(int newBlockCount) | 塊數量變化 |
cursorPositionChanged(const QTextCursor &cursor) | 光標位置變化 |
5. 實用示例
5.1 基本使用
QTextDocument doc;
doc.setPlainText("Hello World!");// 設置格式
QTextCursor cursor(&doc);
cursor.movePosition(QTextCursor::Start);
QTextCharFormat fmt;
fmt.setFontWeight(QFont::Bold);
cursor.insertText("Formatted ", fmt);
5.2 HTML處理
doc.setHtml("<b>Bold</b> and <i>italic</i> text");
QString html = doc.toHtml();
5.3 響應變化
connect(&doc, &QTextDocument::contentsChanged, [](){qDebug() << "Document modified";
});
6. 高級功能
6.1 自定義文檔布局
class CustomLayout : public QAbstractTextDocumentLayout {/* 實現布局邏輯 */
};doc->setDocumentLayout(new CustomLayout(doc));
6.2 文本對象接口
class CustomTextObject : public QObject, public QTextObjectInterface {/* 實現自定義文本對象 */
};QTextCharFormat format;
format.setObjectType(QTextFormat::UserObject + 1);
doc->documentLayout()->registerHandler(format.objectType(), new CustomTextObject);
7. 性能優化技巧
-
批量操作:在大量修改前調用?
blockSignals(true)
,完成后恢復 -
資源管理:對大型文檔使用分頁加載
-
格式重用:復用 QTextFormat 對象減少內存分配
-
布局控制:合理設置 textWidth 和頁面尺寸
二、QTextCursor
QTextCursor 是 Qt 框架中用于操作 QTextDocument 的核心類,提供了對富文本內容的編輯、選擇和格式控制功能。它類似于文本編輯器中的光標,可以移動、插入、刪除文本,并控制文本格式。
1. QTextCursor 基本概念
1.1 主要用途
-
文本插入和刪除:在 QTextDocument 中插入或刪除文本。
-
文本選擇:選擇文本范圍,進行復制、剪切或格式修改。
-
格式控制:設置字符格式(字體、顏色等)和段落格式(對齊、縮進等)。
-
表格和列表操作:插入表格、列表,并控制其結構。
1.2 創建 QTextCursor
// 方式1:基于 QTextDocument 創建
QTextDocument *doc = new QTextDocument;
QTextCursor cursor(doc);// 方式2:基于現有 QTextCursor 復制
QTextCursor anotherCursor(cursor);// 方式3:基于 QTextEdit 獲取(適用于 GUI 應用)
QTextEdit *textEdit = new QTextEdit;
QTextCursor editCursor = textEdit->textCursor();
2. QTextCursor 屬性
QTextCursor 本身沒有直接可訪問的屬性(如?property()
),但可以通過方法獲取或修改其狀態:
屬性(概念) | 獲取方法 | 設置方法 |
---|---|---|
位置 | position() | setPosition(int pos) |
是否有選擇 | hasSelection() | clearSelection() |
選擇范圍 | selectionStart() ,?selectionEnd() | setPosition(pos, mode) |
當前塊(段落) | block() | movePosition() |
當前字符格式 | charFormat() | setCharFormat() |
當前段落格式 | blockFormat() | setBlockFormat() |
是否可撤銷/重做 | isUndoAvailable() ?/?isRedoAvailable() | undo() ?/?redo() |
3. QTextCursor 常用方法
3.1 光標移動
方法 | 說明 |
---|---|
movePosition(MoveOperation op, MoveMode mode = MoveAnchor, int n = 1) | 移動光標(如?StartOfLine ,?EndOfDocument ) |
setPosition(int pos, MoveMode mode = MoveAnchor) | 設置光標位置 |
atStart() ,?atEnd() | 是否在文檔開頭/結尾 |
atBlockStart() ,?atBlockEnd() | 是否在段落開頭/結尾 |
示例:
cursor.movePosition(QTextCursor::StartOfLine); // 移動到行首
cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); // 選擇到文檔末尾
3.2 文本操作
方法 | 說明 |
---|---|
insertText(const QString &text) | 插入純文本 |
insertText(const QString &text, const QTextCharFormat &format) | 插入帶格式的文本 |
insertHtml(const QString &html) | 插入 HTML |
insertFragment(const QTextDocumentFragment &fragment) | 插入文檔片段 |
insertImage(const QTextImageFormat &format) | 插入圖片 |
removeSelectedText() | 刪除選中文本 |
deleteChar() ,?deletePreviousChar() | 刪除字符 |
示例:
QTextCharFormat boldFormat;
boldFormat.setFontWeight(QFont::Bold);
cursor.insertText("Hello, World!", boldFormat);
3.3 選擇操作
方法 | 說明 |
---|---|
select(SelectionType selection) | 選擇文本(如?LineUnderCursor ) |
hasSelection() | 是否有選中文本 |
selectedText() | 獲取選中文本 |
selectionStart() ,?selectionEnd() | 獲取選擇范圍 |
clearSelection() | 清除選擇 |
示例:
cursor.select(QTextCursor::WordUnderCursor); // 選中光標下的單詞
QString selected = cursor.selectedText(); // 獲取選中內容
3.4 格式控制
方法 | 說明 |
---|---|
setCharFormat(const QTextCharFormat &format) | 設置字符格式 |
mergeCharFormat(const QTextCharFormat &format) | 合并字符格式 |
charFormat() | 獲取當前字符格式 |
setBlockFormat(const QTextBlockFormat &format) | 設置段落格式 |
blockFormat() | 獲取當前段落格式 |
示例:
QTextCharFormat redFormat;
redFormat.setForeground(Qt::red);
cursor.mergeCharFormat(redFormat); // 合并格式(不影響其他屬性)
3.5 表格和列表操作
方法 | 說明 |
---|---|
insertTable(int rows, int cols, const QTextTableFormat &format) | 插入表格 |
currentTable() | 獲取當前表格 |
insertList(const QTextListFormat &format) | 插入列表 |
createList(const QTextListFormat &format) | 創建列表 |
示例:
QTextTableFormat tableFormat;
tableFormat.setCellSpacing(5);
cursor.insertTable(3, 2, tableFormat); // 插入 3 行 2 列的表格
4. QTextCursor 信號
QTextCursor?本身不直接發出信號,但它的操作會觸發關聯的?QTextDocument
?或?QTextEdit
?的信號,例如:
-
QTextDocument::contentsChanged()
(內容變化時) -
QTextEdit::cursorPositionChanged()
(光標移動時)
示例(連接信號):
QObject::connect(textEdit, &QTextEdit::cursorPositionChanged, [=]() {qDebug() << "Cursor moved to position:" << textEdit->textCursor().position();
});
5. 總結
功能 | 方法 |
---|---|
創建光標 | QTextCursor(doc) |
移動光標 | movePosition() ,?setPosition() |
插入文本 | insertText() ,?insertHtml() |
選擇文本 | select() ,?selectedText() |
格式控制 | setCharFormat() ,?setBlockFormat() |
表格/列表 | insertTable() ,?insertList() |
三、QTextTable
1. QTextTable 入門
1.1 基本概念
QTextTable 是 QTextDocument 中用于表示表格的類,它:
-
繼承自 QTextFrame,是文檔中的特殊框架結構
-
提供行、列操作和單元格管理
-
支持表格格式設置(邊框、間距等)
-
可以與 QTextCursor 配合進行表格編輯
1.2 創建方式
// 通過QTextCursor創建表格 QTextCursor cursor(textDocument); QTextTableFormat tableFormat; tableFormat.setCellSpacing(2); tableFormat.setCellPadding(4); QTextTable *table = cursor.insertTable(rows, cols, tableFormat);// 從現有文檔獲取表格 QTextFrame::iterator it; for (it = textDocument->rootFrame()->begin(); !it.atEnd(); ++it) {if (QTextTable *table = qobject_cast<QTextTable*>(it.currentFrame())) {// 獲取到表格} }
2. 核心屬性表
屬性 | 類型 | 訪問 | 描述 |
---|---|---|---|
format | QTextTableFormat | 讀寫 | 表格的格式設置 |
rows | int | 只讀 | 表格行數 |
columns | int | 只讀 | 表格列數 |
3. 重要方法分類
3.1 表格結構操作
// 調整表格大小 void resize(int rows, int columns)// 插入/刪除行列 void insertRows(int pos, int num) void insertColumns(int pos, int num) void removeRows(int pos, int num) void removeColumns(int pos, int num)// 合并/拆分單元格 void mergeCells(int row, int column, int numRows, int numColumns) void mergeCells(const QTextCursor &cursor) void splitCell(int row, int column, int numRows, int numColumns)
3.2 單元格操作
// 獲取單元格信息 QTextTableCell cellAt(int row, int column) const QTextTableCell cellAt(const QTextCursor &cursor) const QTextTableCell cellAt(int position) const// 獲取單元格范圍 QTextCursor rowStart(const QTextCursor &cursor) const QTextCursor rowEnd(const QTextCursor &cursor) const
3.3 格式設置
// 設置表格格式 void setFormat(const QTextTableFormat &format)// 設置單元格格式 void setCellFormat(int row, int column, const QTextCharFormat &format)
4. 信號系統
QTextTable 本身不直接發出信號,但表格變化會觸發關聯 QTextDocument 的信號:
-
contentsChanged()
-
contentsChange(int from, int charsRemoved, int charsAdded)
5. 實用示例
5.1 創建格式化表格
QTextCursor cursor(document); QTextTableFormat tableFormat; tableFormat.setBackground(QColor("#f0f0f0")); tableFormat.setBorder(1); tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid); tableFormat.setCellPadding(5); tableFormat.setCellSpacing(0);QTextTable *table = cursor.insertTable(3, 4, tableFormat);// 設置表頭格式 QTextCharFormat headerFormat; headerFormat.setBackground(Qt::gray); headerFormat.setFontWeight(QFont::Bold);for (int col = 0; col < 4; ++col) {QTextTableCell cell = table->cellAt(0, col);QTextCursor cellCursor = cell.firstCursorPosition();cellCursor.insertText(QString("Header %1").arg(col+1), headerFormat); }
5.2 動態修改表格
// 添加新行 table->insertRows(table->rows(), 1);// 合并單元格 table->mergeCells(1, 0, 1, 2);// 設置單元格格式 QTextCharFormat highlightFormat; highlightFormat.setBackground(Qt::yellow);QTextTableCell cell = table->cellAt(2, 1); QTextCursor cellCursor = cell.firstCursorPosition(); cellCursor.insertText("Important", highlightFormat);
5.3 遍歷表格內容
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();QString text = cellCursor.block().text();qDebug() << "Cell[" << row << "," << col << "]: " << text;} }
6. 高級功能
6.1 自定義表格邊框
QTextTableFormat customFormat; QTextLength width(QTextLength::PercentageLength, 100); customFormat.setColumnWidthConstraints({width, width, width});QVector<QTextFormat> formats; QTextFrameFormat borderFormat; borderFormat.setBorder(2); borderFormat.setBorderBrush(QBrush(Qt::darkGreen)); borderFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted); customFormat.setBorderCollapse(true); customFormat.setProperty(QTextFormat::TableBorderBrush, QBrush(Qt::darkBlue));table->setFormat(customFormat);
6.2 表格數據導出
QString html = "<table border='1'>"; for (int row = 0; row < table->rows(); ++row) {html += "<tr>";for (int col = 0; col < table->columns(); ++col) {html += "<td>";QTextTableCell cell = table->cellAt(row, col);html += cell.firstCursorPosition().block().text();html += "</td>";}html += "</tr>"; } html += "</table>";
7.設置 QTextTable 的高度
在 Qt 中,QTextTable
?的高度可以通過幾種方式設置。以下是設置表格高度的常用方法:
1). 設置表格整體高度
QTextTable *table = cursor.insertTable(rows, cols); // 創建表格// 獲取表格格式 QTextTableFormat tableFormat = table->format();// 設置固定高度 tableFormat.setHeight(300); // 像素值 // 或者使用百分比 tableFormat.setHeight(QTextLength(QTextLength::PercentageLength, 50));// 應用格式 table->setFormat(tableFormat);
2). 設置行高
// 設置特定行的高度 QTextTable *table = cursor.insertTable(rows, cols);// 獲取表格格式 QTextTableFormat tableFormat = table->format();// 設置行高(影響所有行) QVector<QTextLength> constraints; for (int i = 0; i < rows; ++i) {constraints << QTextLength(QTextLength::FixedLength, 50); // 每行50像素 } tableFormat.setRowHeightConstraints(constraints);// 應用格式 table->setFormat(tableFormat);
3). 設置單元格高度
// 設置特定單元格的高度 QTextTable *table = cursor.insertTable(rows, cols);// 獲取單元格格式 QTextTableCell cell = table->cellAt(row, col); QTextCharFormat cellFormat = cell.format();// 設置單元格高度(通過設置最小高度) cellFormat.setProperty(QTextFormat::BlockMinimumHeight, 100); // 100像素 cell.setFormat(cellFormat);
注意事項
-
表格高度設置可能會受到內容的影響,如果內容超過設置的高度,表格可能會自動擴展
-
使用?
QTextLength
?可以指定不同類型的長度:-
QTextLength::FixedLength
?- 固定像素值 -
QTextLength::PercentageLength
?- 相對于父容器的百分比
-
-
要確保表格在文檔中有足夠的空間顯示設置的高度
8. 性能優化建議
-
批量操作:在修改大量單元格前調用?
document()->blockSignals(true)
-
格式重用:復用 QTextFormat 對象減少內存分配
-
合理合并單元格:避免過度復雜的表格結構
-
延遲布局:大規模修改后手動調用?
document()->markContentsDirty()
四、QTextTableCell
1. QTextTableCell 入門
1.1 基本概念
QTextTableCell 表示 QTextTable 中的單個單元格,它:
-
是表格的基本組成單元
-
可以包含文本、格式和其他文檔元素
-
具有行/列位置信息和格式屬性
-
可以跨越多行多列(合并單元格)
1.2 獲取單元格的方式
// 通過表格獲取 QTextTable *table = ...; QTextTableCell cell = table->cellAt(row, column);// 通過光標位置獲取 QTextCursor cursor = ...; QTextTableCell cell = table->cellAt(cursor);// 通過文檔位置獲取 int position = ...; QTextTableCell cell = table->cellAt(position);
2. 核心屬性表
屬性 | 類型 | 訪問 | 描述 |
---|---|---|---|
row | int | 只讀 | 單元格起始行索引 |
column | int | 只讀 | 單元格起始列索引 |
rowSpan | int | 只讀 | 單元格跨越的行數 |
columnSpan | int | 只讀 | 單元格跨越的列數 |
format | QTextCharFormat | 讀寫 | 單元格字符格式 |
tableCellFormat | QTextTableCellFormat | 讀寫 | 單元格特有格式 |
3. 重要方法分類
3.1 內容訪問
// 獲取單元格內的光標 QTextCursor firstCursorPosition() const QTextCursor lastCursorPosition() const// 檢查有效性 bool isValid() const
3.2 格式操作
// 設置/獲取格式 void setFormat(const QTextCharFormat &format) QTextCharFormat format() const// 單元格特有格式 void setTableCellFormat(const QTextTableCellFormat &format) QTextTableCellFormat tableCellFormat() const
3.3 布局信息
// 獲取單元格在文檔中的位置范圍 int firstPosition() const int lastPosition() const
4. 信號系統
QTextTableCell 本身不直接發出信號,單元格變化會觸發:
-
關聯 QTextDocument 的?
contentsChanged()
-
父表格的結構變化
5. 實用示例
5.1 基本單元格操作
// 獲取單元格 QTextTableCell cell = table->cellAt(1, 2);// 檢查有效性 if (cell.isValid()) {// 獲取光標并插入內容QTextCursor cellCursor = cell.firstCursorPosition();cellCursor.insertText("Cell Content");// 設置格式QTextCharFormat format;format.setBackground(Qt::yellow);cell.setFormat(format); }
5.2 遍歷單元格內容
for (int row = 0; row < table->rows(); ++row) {for (int col = 0; col < table->columns(); ++col) {QTextTableCell cell = table->cellAt(row, col);if (cell.isValid() && !cell.rowSpan() && !cell.columnSpan()) {QString text = cell.firstCursorPosition().block().text();qDebug() << "Cell[" << row << "," << col << "]: " << text;}} }
5.3 合并單元格操作
// 獲取要合并的起始單元格 QTextTableCell startCell = table->cellAt(0, 0);// 檢查是否已經是合并單元格 if (startCell.rowSpan() == 1 && startCell.columnSpan() == 1) {// 合并2行2列table->mergeCells(startCell.row(), startCell.column(), 2, 2);// 在新合并的單元格中添加內容QTextCursor mergeCursor = startCell.firstCursorPosition();mergeCursor.insertText("Merged Cell");// 設置合并單元格格式QTextTableCellFormat mergeFormat;mergeFormat.setBackground(QColor("#e0e0e0"));mergeFormat.setVerticalAlignment(QTextCharFormat::AlignMiddle);startCell.setTableCellFormat(mergeFormat); }
6. 高級應用
6.1 自定義單元格邊框
QTextTableCell cell = table->cellAt(1, 1); QTextTableCellFormat cellFormat = cell.tableCellFormat();// 設置自定義邊框 cellFormat.setTopBorder(2); cellFormat.setBottomBorder(2); cellFormat.setLeftBorder(1); cellFormat.setRightBorder(1); cellFormat.setTopBorderStyle(QTextFrameFormat::BorderStyle_Dashed); cellFormat.setBorderBrush(QBrush(Qt::darkBlue));cell.setTableCellFormat(cellFormat);
6.2 單元格數據導出
QString exportCellData(const QTextTableCell &cell) {if (!cell.isValid()) return QString();QString content;QTextCursor cursor = cell.firstCursorPosition();while (cursor.position() <= cell.lastPosition()) {content += cursor.block().text();cursor.movePosition(QTextCursor::NextBlock);}return content.trimmed(); }
7. 使用建議
-
有效性檢查:始終檢查?
isValid()
?避免無效單元格操作 -
格式重用:創建 QTextFormat 對象重復使用提高性能
-
合并單元格注意:
-
合并后原單元格變為無效
-
只有左上角單元格保持有效
-
-
性能優化:
-
批量操作前禁用文檔信號
-
避免頻繁的格式更改
-
五、QTextBlockFormat
1. QTextBlockFormat 簡介
QTextBlockFormat
?是 Qt 富文本框架 (QTextDocument
) 的一部分,用于控制文本塊(段落)的格式,包括:
-
對齊方式
-
縮進和邊距
-
背景顏色
-
行高
-
分頁控制
-
制表位設置
它通常與?QTextCursor
?和?QTextDocument
?一起使用,用于格式化段落。
2. 主要屬性
屬性 | 類型 | 默認值 | 描述 |
---|---|---|---|
alignment | Qt::Alignment | Qt::AlignLeft | 段落對齊方式(左對齊、居中、右對齊等) |
leftMargin | qreal | 0.0 | 左縮進(像素或磅值) |
rightMargin | qreal | 0.0 | 右縮進(像素或磅值) |
topMargin | qreal | 0.0 | 段落上方間距 |
bottomMargin | qreal | 0.0 | 段落下方間距 |
textIndent | qreal | 0.0 | 首行縮進 |
lineHeight | qreal | 1.0 | 行高倍數(1.0 = 單倍行距) |
lineHeightType | QTextBlockFormat::LineHeightTypes | SingleHeight | 行高類型(單倍、固定值等) |
background | QBrush | Qt::NoBrush | 段落背景顏色 |
pageBreakPolicy | QTextFormat::PageBreakFlags | QTextFormat::PageBreak_Auto | 分頁策略 |
headingLevel | int | 0 | 標題級別(1-6,0 表示普通段落) |
3. 常用方法
3.1 設置方法
方法 | 參數 | 描述 |
---|---|---|
setAlignment(Qt::Alignment alignment) | Qt::AlignLeft ?/?Qt::AlignCenter ?/?Qt::AlignRight | 設置對齊方式 |
setLeftMargin(qreal margin) | 縮進值(如?20.0 ) | 設置左縮進 |
setRightMargin(qreal margin) | 縮進值(如?20.0 ) | 設置右縮進 |
setTopMargin(qreal margin) | 間距值(如?10.0 ) | 設置段落上邊距 |
setBottomMargin(qreal margin) | 間距值(如?10.0 ) | 設置段落下邊距 |
setTextIndent(qreal indent) | 縮進值(如?30.0 ) | 設置首行縮進 |
setLineHeight(qreal height, int type) | height (行高倍數或固定值),type (SingleHeight ?/?FixedHeight ) | 設置行高 |
setBackground(QBrush brush) | QBrush(Qt::yellow) | 設置背景顏色 |
setPageBreakPolicy(QTextFormat::PageBreakFlags policy) | PageBreak_Auto ?/?PageBreak_AlwaysBefore | 設置分頁策略 |
3.2 獲取方法
方法 | 返回值 | 描述 |
---|---|---|
alignment() | Qt::Alignment | 獲取對齊方式 |
leftMargin() | qreal | 獲取左縮進 |
rightMargin() | qreal | 獲取右縮進 |
topMargin() | qreal | 獲取上邊距 |
bottomMargin() | qreal | 獲取下邊距 |
textIndent() | qreal | 獲取首行縮進 |
lineHeight() | qreal | 獲取行高 |
lineHeightType() | QTextBlockFormat::LineHeightTypes | 獲取行高類型 |
background() | QBrush | 獲取背景畫刷 |
pageBreakPolicy() | QTextFormat::PageBreakFlags | 獲取分頁策略 |
4. 信號
QTextBlockFormat
?本身不直接發出信號,但它的修改會觸發?QTextDocument
?的信號:
-
contentsChanged()
:當段落格式被修改時觸發。 -
contentsChange(int position, int charsRemoved, int charsAdded)
:提供更詳細的修改信息。
5. 示例代碼
// 創建一個 QTextBlockFormat 對象 QTextBlockFormat blockFormat;// 設置對齊方式(居中) blockFormat.setAlignment(Qt::AlignCenter);// 設置縮進和邊距 blockFormat.setLeftMargin(20.0); blockFormat.setRightMargin(20.0); blockFormat.setTextIndent(30.0); // 首行縮進// 設置行高(1.5 倍行距) blockFormat.setLineHeight(1.5, QTextBlockFormat::ProportionalHeight);// 設置背景顏色(黃色) blockFormat.setBackground(QBrush(Qt::yellow));// 應用格式到 QTextCursor QTextCursor cursor = textEdit->textCursor(); cursor.setBlockFormat(blockFormat);
6. 總結
功能 | 方法/屬性 |
---|---|
對齊方式 | setAlignment() ?/?alignment() |
縮進和邊距 | setLeftMargin() ?/?setRightMargin() ?/?setTextIndent() |
行高 | setLineHeight() ?/?lineHeight() |
背景顏色 | setBackground() ?/?background() |
分頁控制 | setPageBreakPolicy() ?/?pageBreakPolicy() |
六、QTextCharFormat
概述
QTextCharFormat 是 Qt 框架中用于描述文本字符格式的類,屬于 QtGui 模塊。它用于設置和獲取文本的視覺屬性,如字體、顏色、背景等。
主要屬性
屬性 | 描述 | 類型 |
---|---|---|
font() / setFont() | 獲取/設置字體 | QFont |
fontFamily() / setFontFamily() | 獲取/設置字體家族 | QString |
fontSize() / setFontSize() | 獲取/設置字體大小 | int |
fontWeight() / setFontWeight() | 獲取/設置字體粗細 | int (QFont::Weight) |
fontItalic() / setFontItalic() | 獲取/設置是否斜體 | bool |
fontUnderline() / setFontUnderline() | 獲取/設置下劃線 | bool |
fontStrikeOut() / setFontStrikeOut() | 獲取/設置刪除線 | bool |
foreground() / setForeground() | 獲取/設置前景色(文本顏色) | QBrush |
background() / setBackground() | 獲取/設置背景色 | QBrush |
textOutline() / setTextOutline() | 獲取/設置文本輪廓 | QPen |
underlineColor() / setUnderlineColor() | 獲取/設置下劃線顏色 | QColor |
underlineStyle() / setUnderlineStyle() | 獲取/設置下劃線樣式 | QTextCharFormat::UnderlineStyle |
verticalAlignment() / setVerticalAlignment() | 獲取/設置垂直對齊方式 | QTextCharFormat::VerticalAlignment |
toolTip() / setToolTip() | 獲取/設置工具提示文本 | QString |
anchorHref() / setAnchorHref() | 獲取/設置超鏈接URL | QString |
anchorNames() / setAnchorNames() | 獲取/設置錨點名稱 | QStringList |
isAnchor() | 檢查是否為錨點 | bool |
常用方法
方法 | 描述 |
---|---|
clearBackground() | 清除背景設置 |
clearForeground() | 清除前景設置 |
merge(const QTextCharFormat &other) | 合并另一個格式的屬性 |
isValid() | 檢查格式是否有效 |
objectType() | 獲取對象類型 |
信號
QTextCharFormat 本身不直接發出信號,因為它是一個數據類。但是,當它的屬性在 QTextDocument 或 QTextEdit 中被修改時,相關的文本編輯組件會發出信號,如:
-
QTextEdit::currentCharFormatChanged(const QTextCharFormat &format)
-
QTextDocument::contentsChange(int position, int charsRemoved, int charsAdded)
使用示例
// 創建 QTextCharFormat 對象 QTextCharFormat format;// 設置字體屬性 format.setFont(QFont("Arial", 12)); format.setFontWeight(QFont::Bold); format.setFontItalic(true);// 設置顏色 format.setForeground(Qt::blue); format.setBackground(Qt::yellow);// 設置下劃線 format.setUnderlineStyle(QTextCharFormat::SingleUnderline); format.setUnderlineColor(Qt::red);// 在 QTextEdit 中應用格式 QTextCursor cursor = textEdit->textCursor(); cursor.mergeCharFormat(format);
注意事項
-
QTextCharFormat 通常與 QTextCursor 或 QTextDocument 一起使用
-
修改格式后需要手動應用到文本或光標
-
可以使用 merge() 方法合并多個格式屬性
-
格式屬性是疊加的,未設置的屬性會保持原樣
七、QTextImageFormat
1. QTextImageFormat 簡介
QTextImageFormat
?是 Qt 富文本框架 (QTextDocument
) 的一部分,用于在文本中插入和控制圖像格式。它是?QTextCharFormat
?的子類,可以設置圖像大小、名稱、質量等屬性。
2. 主要屬性
屬性 | 類型 | 默認值 | 描述 |
---|---|---|---|
name | QString | "" | 圖像資源路徑(如?":/images/logo.png" ) |
width | qreal | 0 | 圖像顯示寬度(像素) |
height | qreal | 0 | 圖像顯示高度(像素) |
quality | int | -1 | 圖像質量(0-100,-1 表示默認) |
devicePixelRatio | qreal | 1.0 | 高 DPI 縮放比例 |
imageUrl | QUrl | QUrl() | 圖像 URL(支持本地/網絡路徑) |
imageData | QByteArray | QByteArray() | 圖像的原始數據 |
3. 常用方法
3.1 設置方法
方法 | 參數 | 描述 |
---|---|---|
setName(const QString &name) | 圖像路徑(如?"logo.png" ) | 設置圖像資源 |
setWidth(qreal width) | 寬度值(如?200.0 ) | 設置顯示寬度 |
setHeight(qreal height) | 高度值(如?150.0 ) | 設置顯示高度 |
setQuality(int quality) | 質量值(0-100) | 設置壓縮質量 |
setDevicePixelRatio(qreal ratio) | 縮放比例(如?2.0 ) | 適配高 DPI 屏幕 |
setImageUrl(const QUrl &url) | QUrl("file:///path/to/image.png") | 設置圖像 URL |
setImageData(const QByteArray &data) | QByteArray (PNG/JPG 數據) | 直接設置圖像二進制數據 |
3.2 獲取方法
方法 | 返回值 | 描述 |
---|---|---|
name() | QString | 獲取圖像資源路徑 |
width() | qreal | 獲取顯示寬度 |
height() | qreal | 獲取顯示高度 |
quality() | int | 獲取圖像質量 |
devicePixelRatio() | qreal | 獲取設備像素比例 |
imageUrl() | QUrl | 獲取圖像 URL |
imageData() | QByteArray | 獲取原始圖像數據 |
isValid() | bool | 檢查格式是否有效 |
4. 信號
QTextImageFormat
?本身不直接發出信號,但它的修改會觸發?QTextDocument
?的信號:
-
contentsChanged()
:當圖像被插入或修改時觸發。 -
contentsChange(int position, int charsRemoved, int charsAdded)
:提供更詳細的修改信息。
5. 示例代碼
5.1 插入圖像
// 創建圖像格式 QTextImageFormat imageFormat; imageFormat.setName(":/images/logo.png"); imageFormat.setWidth(200); imageFormat.setHeight(100);// 使用 QTextCursor 插入圖像 QTextCursor cursor = textEdit->textCursor(); cursor.insertImage(imageFormat);// 或者直接插入(自動創建 QTextImageFormat) cursor.insertImage(":/images/logo.png", 200, 100);
5.2 從文件加載圖像
QTextImageFormat imageFormat; imageFormat.setImageUrl(QUrl::fromLocalFile("C:/path/to/image.jpg")); imageFormat.setWidth(300); textCursor.insertImage(imageFormat);
5.3 調整圖像質量
QTextImageFormat imageFormat; imageFormat.setName("photo.jpg"); imageFormat.setQuality(80); // 設置 JPEG 質量為 80 textCursor.insertImage(imageFormat);
6. 總結
功能 | 方法/屬性 |
---|---|
設置圖像源 | setName() ?/?setImageUrl() |
調整尺寸 | setWidth() ?/?setHeight() |
控制質量 | setQuality() |
高 DPI 支持 | setDevicePixelRatio() |
直接插入二進制數據 | setImageData() |
適用場景
-
富文本編輯器(如 Markdown 圖片插入)
-
報告生成(嵌入圖表或 Logo)
-
聊天應用(顯示表情/圖片)
注意事項
-
如果只設置?
width
?或?height
,另一個維度會自動按比例縮放。 -
name
?通常用于 Qt 資源文件(:/prefix/path
),而?imageUrl
?支持本地/網絡路徑。 -
在打印或導出 PDF 時,
quality
?會影響輸出清晰度。