使用QTextEdit,我需要单独更改每个段落的字体属性。这类似于当用户从菜单中选择样式(而不是特定格式)时,有多少字处理器更改段落的字体。
理想情况下,我想在布局和渲染之前将一个QTextCharFormat(或等效的)应用于块(段落),但是我希望文本中不会插入任何字体属性,如我不希望在文件中包含此信息,但我需要保留用户可能设置为段落中的单词的任何粗体/斜体/下划线属性(我打算将所需信息保存在QTextBlock中: :用户数据)。但是,我无法确定插入函数以执行此任务所需的位置。
我认为我无法从QTextBlock和QTextCursor更改段落的QTextCharFormat,因为这仅适用于新块,它不会影响具有现有文本的块。
我查看了QTextLayout,但我不认为我的答案就在那里。
我几天来一直在寻找这个问题的解决方案。对于任何指向正确方向的人,我都会非常优雅。
我有多年的C ++经验,但我对Qt有点新鲜。使用Qt 4.8。
编辑:
我在上面强调(粗体)是我尝试做的重要部分。换句话说,我真正想做的是能够在显示之前将字体属性应用于文本块(可能是临时副本)。为了实现这个目标,我非常适合推导和修改(甚至重新实现)我需要的任何类,但我需要指出正确的方向,我实际需要改变什么。作为最后的手段,我还可以直接修改一些Qt类,如果这对于任务是必要的,但是我还需要知道我需要触摸哪个类。我希望这更清楚。我发现很难解释这一点,但不允许告诉你应用程序将做什么。
答案 0 :(得分:9)
#include <QTextEdit> // not needed if using the designer
#include <QTextDocument>
#include <QTextBlock>
#include <QTextCursor>
我需要它来管理块。函数QTextDocument::findBlockByNumber
非常方便找到以前的块,我认为这就是你所追求的。
块文本的容器。一个美好而方便的课程。
令人惊讶的是,QTextBlock
类中没有格式设置器。因此,我使用QTextCursor
作为解决方法,因为此类中有四个格式设置器。
// For block management
QTextDocument *doc = new QTextDocument(this);
ui->textEdit->setDocument(doc); // from QTextEdit created by the Designer
//-------------------------------------------------
// Locate the 1st block
QTextBlock block = doc->findBlockByNumber(0);
// Initiate a copy of cursor on the block
// Notice: it won't change any cursor behavior of the text editor, since it
// just another copy of cursor, and it's "invisible" from the editor.
QTextCursor cursor(block);
// Set background color
QTextBlockFormat blockFormat = cursor.blockFormat();
blockFormat.setBackground(QColor(Qt::yellow));
cursor.setBlockFormat(blockFormat);
// Set font
for (QTextBlock::iterator it = cursor.block().begin(); !(it.atEnd()); ++it)
{
QTextCharFormat charFormat = it.fragment().charFormat();
charFormat.setFont(QFont("Times", 15, QFont::Bold));
QTextCursor tempCursor = cursor;
tempCursor.setPosition(it.fragment().position());
tempCursor.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor);
tempCursor.setCharFormat(charFormat);
}
<强>参考:强> How to change current line format in QTextEdit without selection?
建筑环境:Qt 4.8 + MSVC2010编译器+ Windows 7 32位
该演示仅用于显示在特定块上设置格式的概念。
纯文字输入
格式1 (请注意,它不会打扰视图中的当前光标)
格式2
答案 1 :(得分:0)
您可以使用QTextCursor修改现有块。
只需获取光标并将其移动到块的开头即可。然后使用锚点移动它以创建选择。
将此光标设置为文本编辑的当前光标并应用更改。
答案 2 :(得分:-1)
QTextEdit
接受HTML,因此您所要做的就是将段落格式化为HTML。见下面的例子:
QString text = "<p><b>Paragraph 1</b></p><p><i>Paragraph 2</i></p>";
QTextCursor cursor = ui->textEdit->textCursor();
cursor.insertHtml(text);
这将创建这样的东西:
第1段
第2段
话虽如此,Qt中只支持一部分HTML。见Supported HTML Subset