读取富文本字符和块格式
Reading Rich Text Character and Block Formatting
我使用 QGraphicsTextItem
实现了富文本项目
设置字体大小,例如:
void set (int fontSize) {
QTextCursor _cursor = textCursor();
QTextCharFormat _format;
_format.setFontPointSize(fontSize);
_cursor.mergeCharFormat(_format);
setTextCursor(_cursor); }
更复杂的是读取字体大小。
假设我有一个选择,我必须遍历文档,遍历所有 QTextBlock
、QTextFragment
,阅读 QTextCharFormat
...
但是简单的选项,如果没有选择,只是读取光标处的字体大小:
int get () {
return textCursor().charFormat().fontPointSize(); }
这有效,但我发现了 3 个问题:
1) 通过QGraphicsTextItem
属性设置字体大小:
QFont f = font();
f.setPointSize(20);
setFont(f);
这个 returns 0 通过我上面的 get
函数。要设置整个项目的字体大小,我必须使用与 set
函数中相同的方法。
setFont
方法不应该设置可以从 QTextCursor
读取的字体吗?
2) setHtml
可以设置格式 - 但我看不到任何读取该格式的方法
如何从 html 片段中读取富文本格式?是唯一的可能性,解析 html ?
3)(我目前的绊脚石)
从外部来源复制格式化文本并粘贴到 QGraphicsTextItem
中似乎保持了来源的格式 - 但我如何读取该格式?
如果文本是从外部粘贴的,则上面的 get
方法读取字体大小为 0。
font().pointSize()
总是 returns 8.(我没有设置它所以我想这是默认值)
还有其他读取文本格式的方法吗?
剪贴板文本的格式是否使用 html ?
如何从粘贴的文本中找到字体大小(或任何其他格式)?
(同样的问题适用于块格式,如对齐)。
我认为您的大部分问题都可以通过为您的 QGraphicsTextItem
对象获取 QTextDocument
并使用它来解决。 QTextDocument
及其方法(如 QTextFormat::property(int propertyId)) can help you to get a lot of properties 用于您的文本。
1) 如果您使用 QFont
对象设置大小,您应该使用相同的方式获取大小。
2) 当您使用 html 设置文本时,QGraphicsTextItem::font()
没有用,因此您需要获取 QTextDocument
并改用它们的功能。
3) 与 2 相同。我认为...因为我没有您的代码来测试它:)
嗯,这里有一个代码作为例子。希望这个回答对你有帮助。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsTextItem>
#include <QTextCursor>
#include <QTextCharFormat>
#include <QFont>
#include <QDebug>
#include <QTextDocument>
#include <QTextBlock>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
/* ITEM 1 */
QGraphicsTextItem* item_1 = new QGraphicsTextItem("QGraphicsTextItem 1");
item_1->setTextInteractionFlags(Qt::TextEditorInteraction);
QFont f = item_1->font();
f.setPointSize(30);
item_1->setFont(f);
qDebug() << "textCursor().position() (returns 0): " <<
item_1->textCursor().position();
qDebug() << "textCursor().charFormat().fontPointSize() (returns 0): " <<
item_1->textCursor().charFormat().fontPointSize();
qDebug() << "font().pointSize() (returns 30 - OK!): " <<
item_1->font().pointSize();
QTextDocument* doc = item_1->document();
f = doc->defaultFont();
qDebug() << "pointSize (returns 30 - OK!): " << f.pointSize();
scene.addItem(item_1);
/* ITEM 2 */
QGraphicsTextItem* item_2 = new QGraphicsTextItem();
item_2->setPos(0, 50);
item_2->setHtml("<html><head/><body><p>"
"<span style=\"font-size:14pt; font-weight:600;\">QGraphics</span>"
"<span style=\"font-size:24pt; font-weight:600;\">TextItem 2</span>"
"</p></body></html>");
qDebug() << "font().pointSize() (returns 8, the default value): "
<< item_2->font().pointSize();
doc = item_2->document();
f = doc->defaultFont();
qDebug() << "pointSize (returns 8, the default value): " << f.pointSize();
QVector<QTextFormat> formats = doc->allFormats();
QVectorIterator<QTextFormat> i(formats);
while (i.hasNext()) {
QTextFormat format = i.next();
if (format.property(QTextFormat::FontPointSize).isValid())
qDebug() << "format.property (returns 14 or 24): " <<
format.property(QTextFormat::FontPointSize).toInt();
}
/*
* Get the block of text. In this example, we only have one block, but
* two text fragments (see below)
*/
QTextBlock text_block = item_2->document()->findBlock(1);
QTextBlock::iterator it;
for (it = text_block.begin(); !(it.atEnd()); ++it) {
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid())
qDebug() << "currentFragment.text(): " << currentFragment.text();
qDebug() << "currentFragment.charFormat().font().pointSize() "
"(returns 14 or 24, depending on"
"the current text fragment): " <<
currentFragment.charFormat().font().pointSize();
}
scene.addItem(item_2);
view.setFixedSize(640, 480);
view.show();
return a.exec();
}
我使用 QGraphicsTextItem
设置字体大小,例如:
void set (int fontSize) {
QTextCursor _cursor = textCursor();
QTextCharFormat _format;
_format.setFontPointSize(fontSize);
_cursor.mergeCharFormat(_format);
setTextCursor(_cursor); }
更复杂的是读取字体大小。
假设我有一个选择,我必须遍历文档,遍历所有 QTextBlock
、QTextFragment
,阅读 QTextCharFormat
...
但是简单的选项,如果没有选择,只是读取光标处的字体大小:
int get () {
return textCursor().charFormat().fontPointSize(); }
这有效,但我发现了 3 个问题:
1) 通过QGraphicsTextItem
属性设置字体大小:
QFont f = font();
f.setPointSize(20);
setFont(f);
这个 returns 0 通过我上面的 get
函数。要设置整个项目的字体大小,我必须使用与 set
函数中相同的方法。
setFont
方法不应该设置可以从 QTextCursor
读取的字体吗?
2) setHtml
可以设置格式 - 但我看不到任何读取该格式的方法
如何从 html 片段中读取富文本格式?是唯一的可能性,解析 html ?
3)(我目前的绊脚石)
从外部来源复制格式化文本并粘贴到 QGraphicsTextItem
中似乎保持了来源的格式 - 但我如何读取该格式?
如果文本是从外部粘贴的,则上面的 get
方法读取字体大小为 0。
font().pointSize()
总是 returns 8.(我没有设置它所以我想这是默认值)
还有其他读取文本格式的方法吗?
剪贴板文本的格式是否使用 html ?
如何从粘贴的文本中找到字体大小(或任何其他格式)?
(同样的问题适用于块格式,如对齐)。
我认为您的大部分问题都可以通过为您的 QGraphicsTextItem
对象获取 QTextDocument
并使用它来解决。 QTextDocument
及其方法(如 QTextFormat::property(int propertyId)) can help you to get a lot of properties 用于您的文本。
1) 如果您使用 QFont
对象设置大小,您应该使用相同的方式获取大小。
2) 当您使用 html 设置文本时,QGraphicsTextItem::font()
没有用,因此您需要获取 QTextDocument
并改用它们的功能。
3) 与 2 相同。我认为...因为我没有您的代码来测试它:)
嗯,这里有一个代码作为例子。希望这个回答对你有帮助。
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsTextItem>
#include <QTextCursor>
#include <QTextCharFormat>
#include <QFont>
#include <QDebug>
#include <QTextDocument>
#include <QTextBlock>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
/* ITEM 1 */
QGraphicsTextItem* item_1 = new QGraphicsTextItem("QGraphicsTextItem 1");
item_1->setTextInteractionFlags(Qt::TextEditorInteraction);
QFont f = item_1->font();
f.setPointSize(30);
item_1->setFont(f);
qDebug() << "textCursor().position() (returns 0): " <<
item_1->textCursor().position();
qDebug() << "textCursor().charFormat().fontPointSize() (returns 0): " <<
item_1->textCursor().charFormat().fontPointSize();
qDebug() << "font().pointSize() (returns 30 - OK!): " <<
item_1->font().pointSize();
QTextDocument* doc = item_1->document();
f = doc->defaultFont();
qDebug() << "pointSize (returns 30 - OK!): " << f.pointSize();
scene.addItem(item_1);
/* ITEM 2 */
QGraphicsTextItem* item_2 = new QGraphicsTextItem();
item_2->setPos(0, 50);
item_2->setHtml("<html><head/><body><p>"
"<span style=\"font-size:14pt; font-weight:600;\">QGraphics</span>"
"<span style=\"font-size:24pt; font-weight:600;\">TextItem 2</span>"
"</p></body></html>");
qDebug() << "font().pointSize() (returns 8, the default value): "
<< item_2->font().pointSize();
doc = item_2->document();
f = doc->defaultFont();
qDebug() << "pointSize (returns 8, the default value): " << f.pointSize();
QVector<QTextFormat> formats = doc->allFormats();
QVectorIterator<QTextFormat> i(formats);
while (i.hasNext()) {
QTextFormat format = i.next();
if (format.property(QTextFormat::FontPointSize).isValid())
qDebug() << "format.property (returns 14 or 24): " <<
format.property(QTextFormat::FontPointSize).toInt();
}
/*
* Get the block of text. In this example, we only have one block, but
* two text fragments (see below)
*/
QTextBlock text_block = item_2->document()->findBlock(1);
QTextBlock::iterator it;
for (it = text_block.begin(); !(it.atEnd()); ++it) {
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid())
qDebug() << "currentFragment.text(): " << currentFragment.text();
qDebug() << "currentFragment.charFormat().font().pointSize() "
"(returns 14 or 24, depending on"
"the current text fragment): " <<
currentFragment.charFormat().font().pointSize();
}
scene.addItem(item_2);
view.setFixedSize(640, 480);
view.show();
return a.exec();
}