1

我有使用实现的富文本项目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 个问题:

QGraphicsTextItem1)通过属性设置字体大小:

QFont f = font();
f.setPointSize(20);
setFont(f);

这通过我上面的函数返回 0 get。要设置整个项目的字体大小,我必须使用与函数中相同的方法set
该方法不应该setFont设置一个可以从QTextCursor?

2)setHtml可以设置格式 - 但我看不到任何读取格式的方法
如何从 html 片段中读取富文本格式?是唯一的可能性,解析 html 吗?

3)(我目前的绊脚石)
从外部源复制格式化的文本并粘贴QGraphicsTextItem似乎保持源的格式 - 但我怎样才能阅读该格式?
如果文本是从外部粘贴的,则上述get方法读取字体大小为 0。
font().pointSize()总是返回 8。(我没有设置它,所以我想这是默认值)
是否有另一种读取文本格式的方法?
剪贴板文本是使用 html 格式化的吗?

如何从粘贴的文本中找到字体大小(或任何其他格式)?

(同样的问题也适用于块格式,比如对齐)。

4

1 回答 1

1

我认为您的大多数问题都可以通过获取QTextDocument您的QGraphicsTextItem对象并使用它来解决。QTextDocument及其方法(如QTextFormat::property(int propertyId))可以帮助您获取文本的大量属性

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();
}
于 2015-09-29T08:02:07.630 回答