QTextDocument 入門

一、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. 核心屬性表

屬性類型訪問描述
baseUrlQUrl讀寫解析相對URL的基礎地址
blockCountint只讀文檔中的文本塊數量
characterCountint只讀文檔字符總數
defaultFontQFont讀寫默認字體設置
documentMarginqreal讀寫文檔頁邊距
indentWidthqreal讀寫縮進寬度
isEmptybool只讀是否為空文檔
modifiedbool讀寫文檔是否被修改
pageSizeQSizeF讀寫頁面尺寸
textWidthqreal讀寫文本寬度限制
titleQString讀寫文檔標題
undoRedoEnabledbool讀寫是否啟用撤銷/重做

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. 性能優化技巧

  1. 批量操作:在大量修改前調用?blockSignals(true),完成后恢復

  2. 資源管理:對大型文檔使用分頁加載

  3. 格式重用:復用 QTextFormat 對象減少內存分配

  4. 布局控制:合理設置 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. 核心屬性表

屬性類型訪問描述
formatQTextTableFormat讀寫表格的格式設置
rowsint只讀表格行數
columnsint只讀表格列數

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);

注意事項

  1. 表格高度設置可能會受到內容的影響,如果內容超過設置的高度,表格可能會自動擴展

  2. 使用?QTextLength?可以指定不同類型的長度:

    • QTextLength::FixedLength?- 固定像素值

    • QTextLength::PercentageLength?- 相對于父容器的百分比

  3. 要確保表格在文檔中有足夠的空間顯示設置的高度

8. 性能優化建議

  1. 批量操作:在修改大量單元格前調用?document()->blockSignals(true)

  2. 格式重用:復用 QTextFormat 對象減少內存分配

  3. 合理合并單元格:避免過度復雜的表格結構

  4. 延遲布局:大規模修改后手動調用?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. 核心屬性表

屬性類型訪問描述
rowint只讀單元格起始行索引
columnint只讀單元格起始列索引
rowSpanint只讀單元格跨越的行數
columnSpanint只讀單元格跨越的列數
formatQTextCharFormat讀寫單元格字符格式
tableCellFormatQTextTableCellFormat讀寫單元格特有格式

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. 使用建議

  1. 有效性檢查:始終檢查?isValid()?避免無效單元格操作

  2. 格式重用:創建 QTextFormat 對象重復使用提高性能

  3. 合并單元格注意

    • 合并后原單元格變為無效

    • 只有左上角單元格保持有效

  4. 性能優化

    • 批量操作前禁用文檔信號

    • 避免頻繁的格式更改

五、QTextBlockFormat

1. QTextBlockFormat 簡介

QTextBlockFormat?是 Qt 富文本框架 (QTextDocument) 的一部分,用于控制文本塊(段落)的格式,包括:

  • 對齊方式

  • 縮進和邊距

  • 背景顏色

  • 行高

  • 分頁控制

  • 制表位設置

它通常與?QTextCursor?和?QTextDocument?一起使用,用于格式化段落。

2. 主要屬性

屬性類型默認值描述
alignmentQt::AlignmentQt::AlignLeft段落對齊方式(左對齊、居中、右對齊等)
leftMarginqreal0.0左縮進(像素或磅值)
rightMarginqreal0.0右縮進(像素或磅值)
topMarginqreal0.0段落上方間距
bottomMarginqreal0.0段落下方間距
textIndentqreal0.0首行縮進
lineHeightqreal1.0行高倍數(1.0 = 單倍行距)
lineHeightTypeQTextBlockFormat::LineHeightTypesSingleHeight行高類型(單倍、固定值等)
backgroundQBrushQt::NoBrush段落背景顏色
pageBreakPolicyQTextFormat::PageBreakFlagsQTextFormat::PageBreak_Auto分頁策略
headingLevelint0標題級別(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(行高倍數或固定值),typeSingleHeight?/?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()獲取/設置超鏈接URLQString
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);

注意事項

  1. QTextCharFormat 通常與 QTextCursor 或 QTextDocument 一起使用

  2. 修改格式后需要手動應用到文本或光標

  3. 可以使用 merge() 方法合并多個格式屬性

  4. 格式屬性是疊加的,未設置的屬性會保持原樣

七、QTextImageFormat

1. QTextImageFormat 簡介

QTextImageFormat?是 Qt 富文本框架 (QTextDocument) 的一部分,用于在文本中插入和控制圖像格式。它是?QTextCharFormat?的子類,可以設置圖像大小、名稱、質量等屬性。

2. 主要屬性

屬性類型默認值描述
nameQString""圖像資源路徑(如?":/images/logo.png"
widthqreal0圖像顯示寬度(像素)
heightqreal0圖像顯示高度(像素)
qualityint-1圖像質量(0-100,-1 表示默認)
devicePixelRatioqreal1.0高 DPI 縮放比例
imageUrlQUrlQUrl()圖像 URL(支持本地/網絡路徑)
imageDataQByteArrayQByteArray()圖像的原始數據

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)

  • 聊天應用(顯示表情/圖片)

注意事項

  1. 如果只設置?width?或?height,另一個維度會自動按比例縮放。

  2. name?通常用于 Qt 資源文件(:/prefix/path),而?imageUrl?支持本地/網絡路徑。

  3. 在打印或導出 PDF 時,quality?會影響輸出清晰度。

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

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

相關文章

WebRTC服務器Coturn服務器相關測試工具

1、概述 在安裝開源的webrtc服務器coturn服務器后&#xff0c;會附帶安裝coturn的相關工具&#xff0c;主要有以下幾種工具 2、turnadmin工具 說明&#xff1a;服務器命令行工具&#xff0c;提供添加用戶、添加管理員、生成TURN密鑰等功能&#xff0c;turnadmin -h查看詳細用…

如何創建Vue3工程

1.首先下載環境 &#xff08;默認下好了VS code&#xff09; Node.js: Node.js 中文網 — 下載 Node.js 選擇要下載的版本 檢查環境&#xff1a; 在命令行中輸入 node ,檢查版本號 2.創建工程 1.找到自己要創建工程的文件目錄&#xff0c;右鍵打開打開終端 在終端輸入創…

基于大模型的肛裂手術全流程預測與治療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與創新點 1.3 研究方法與技術路線 二、肛裂概述與大模型技術原理 2.1 肛裂的醫學定義與分類 2.2 肛裂的發病機制與臨床癥狀 2.3 大模型技術簡介 三、大模型在肛裂術前預測的應用 3.1 術前風險因素分析與數據收集 3.2 …

【趣味小游戲】--掃雷游戲

目錄 一.test.c部分 二.game.h部分 三.game.c部分 前言:前面學習了數組和函數等c語言相關知識&#xff0c;這篇文章我們將通過這些知識分為三個文件來完成掃雷游戲&#xff1b; 1.test.c //文件中寫游戲的測試邏輯 2.game.c //文件中寫游戲中函數的實現等 3.game.h. //文件中寫…

【微服務】SpringBoot制作Docker鏡像接入SkyWalking詳解

目錄 一、前言 二、SkyWalking介紹 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整體架構 2.4 SkyWalking主要工作流程 三、前置準備 3.1 搭建SkyWalking服務 3.1.1 下載安裝包 3.1.2 上傳服務器目錄 2.1.3 數據庫持久化配置說明 3.1.4 啟動skywalk…

從零開始構建微博爬蟲與數據分析系統

從零開始構建微博爬蟲與數據分析系統 引言 社交媒體平臺蘊含著海量的信息和數據&#xff0c;通過對這些數據的收集和分析&#xff0c;我們可以挖掘出有價值的見解。本文將詳細介紹如何構建一個完整的微博爬蟲和數據分析系統&#xff0c;從數據爬取、清洗、到多維度分析與可視…

深入探索RAG:用LlamaIndex為大語言模型擴展知識,實現智能檢索增強生成

大型語言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT和Llama&#xff0c;在回答問題方面表現出色&#xff0c;但它們的知識僅限于訓練時所獲取的信息。它們無法訪問私有數據&#xff0c;也無法在訓練截止日期之后學習新知識。那么&#xff0c;核心問題就是……我們如…

【延遲雙刪】簡單解析

使用場景&#xff1a;【高并發】情況下的做【更新操作】 什么是延遲雙刪 首次刪除&#xff1a;當需要更新某個數據項時&#xff0c;首先刪除緩存中的該項。 更新數據庫&#xff1a;接著&#xff0c;更新數據庫中的該項。 短暫延遲&#xff1a;然后等待一段很短的時間&#xff…

解決Windows安全中心顯示空白頁面

1、電腦重裝系統后&#xff0c;發現原本一些軟件打不開了&#xff0c;電腦莫名認為有病毒&#xff0c;自動刪除插件。附圖。 2、第一反應是電腦防火墻的原因&#xff0c;默認威脅防護識別到了病毒軟件&#xff0c;自動刪除。在開始屏幕搜Windows安全中心&#xff0c;打開之后發…

【回眸】error: failed to compile `xxxxxx`重裝rust環境

在ubuntu上安裝軟件報錯 error: failed to compile cxx2flow v0.6.2 Caused by: package cargo-platform v0.1.9 cannot be built because it requires rustc 1.78 or newer, while the currently active rustc version is 1.75.0 Try re-running cargo install with --lo…

算法—冒泡排序—js(教學示例、小數據)

冒泡排序原理 冒泡排序是一種簡單的排序算法&#xff0c;通過重復遍歷數組&#xff0c;比較相鄰元素并交換位置&#xff0c;使較大的元素逐漸“浮”到數組末尾。 特點 時間復雜度&#xff1a;平均 O(n)&#xff0c;最優&#xff08;已有序時&#xff09;O(n) 空間復雜度&#…

linux sysfs的使用

在Linux內核驅動開發中&#xff0c;device_create_file 和 device_remove_file 用于動態創建/刪除設備的 sysfs 屬性文件&#xff0c;常用于暴露設備信息或控制參數。以下是完整示例及詳細說明&#xff1a; 1. 頭文件引入 #include <linux/module.h> #include <linux/…

利用 Deepseek 和 Mermaid 畫流程圖

提示詞 你是一個產品經理&#xff0c;請繪制一個報名比賽的流程圖&#xff0c;要求生成符合Mermaid語法的代碼&#xff0c;具體要求如下&#xff1a; 1.注冊賬號 2.填寫報名信息 3.參加比賽 4.查看比賽結果 生成的結果 flowchart TDA([開始]) --> B[注冊賬號]B --> C{賬…

【圖像標注技巧】目標檢測圖像標注技巧

介紹一些圖像標注技巧。之前引用過別人的文章 yolo目標檢測 技巧 trick 提升模型性能&#xff0c;deep research檢測調研報告也可以進行參考。 拉框類的標注&#xff0c;如果你不確定哪種方法好&#xff0c;你可以把所標注區域的都剪切出來&#xff0c;然后站在屏幕一米之外瞇…

數字信號處理技術架構與功能演進

數字信號處理&#xff08;DSP&#xff09;是通過數字運算實現信號分析、變換、濾波及調制解調的技術領域&#xff0c;其發展過程與技術應用如下&#xff1a; 一、定義與核心功能 技術定義&#xff1a;通過算法將模擬信號轉換為數字形式進行處理&#xff0c;具有高精度、可編程…

瀏覽器上下文通信

文章目錄 瀏覽器上下文通信同源通信同源通信流程同一瀏覽器上下文通信不同瀏覽器上下文通信 跨域通信前端和前端跨域前端和后端跨域 瀏覽器上下文通信 瀏覽器上下文通信分為兩種&#xff1a;同源和跨源。同樣的同源通信也分為同一瀏覽器上下文和不同的瀏覽器上下文。 同源通信…

Linux 離線部署 Docker 18.06.3 終極指南(附一鍵安裝卸載腳本)

Linux 離線部署 Docker 18.06.3 終極指南&#xff08;附一鍵安裝/卸載腳本&#xff09; 摘要&#xff1a;本文針對無外網環境的 Linux 服務器&#xff0c;提供基于二進制包的 Docker 18.06.3 離線安裝全流程指南。包含自動化腳本設計、服務配置優化及安全卸載方案&#xff0c;…

【前端】跟著maxkb學習logicflow流程圖畫法

文章目錄 背景1. 選定學習對象-maxkb應用邏輯編排2. 確定實現框架3. 關鍵邏輯&#xff1a;查看app-node.js4. 學習開始節點繪制流程數據形式 5. 給節點增加表單輸入框遇到過的問題 背景 看看前端如何繪制流程圖&#xff0c;界面好看點。 "logicflow/core": "1.…

Android 12系統靜態壁紙深度定制指南

1. 需求背景與實現原理 在Android 12系統ROM定制開發中&#xff0c;擴展靜態壁紙功能需要深入理解WallpaperManagerService的架構體系。系統壁紙管理通過雙端協作實現&#xff1a; WallpaperManagerService&#xff08;frameworks層&#xff09;&#xff1a;負責壁紙狀態管理、…

相得益彰 — 基于 GraphRAG 事理圖譜驅動的實時金融行情新聞資訊洞察

*本文為亞馬遜云科技博客文章&#xff0c;僅用于技術分享&#xff0c;不構成投資建議或金融決策支持。文中涉及的公司名稱僅用于技術示例&#xff0c;不代表亞馬遜云科技觀點或與這些公司的商業合作關系。 背景介紹 在當今這個信息爆炸的時代&#xff0c;金融市場每天都在產生…