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

getこれは、上記の関数によって 0 を返します。項目全体のフォント サイズを設定するには、関数と同じ方法を使用する必要がありsetます。メソッドは、から読み取ることができるフォントを設定する
べきではありませんか?setFontQTextCursor

2)setHtmlフォーマットを設定できますが、そのフォーマットを読み取る方法がわかりません
。html フラグメントからリッチ テキストのフォーマットを読み取るにはどうすればよいですか? html を解析する唯一の可能性はありますか?

3)(私の現在のつまずき)
外部ソースからフォーマットされたテキストをコピーして貼り付けるとQGraphicsTextItem、ソースのフォーマットが維持されているように見えますが、そのフォーマットをどのように読むことができますか?
上記のgetメソッドは、テキストが外部から貼り付けられた場合、フォント サイズ 0 を読み取ります。
font().pointSize()常に 8 を返します (設定していないので、デフォルトだと思います)
テキスト形式を読み取る別の方法はありますか?
クリップボードのテキストは html を使用してフォーマットされていますか?

貼り付けたテキストからフォント サイズ (またはその他の書式設定) を見つけるにはどうすればよいですか?

(配置などのブロックの書式設定にも同じ質問が適用されます)。

4

1 に答える 1

1

オブジェクトの を取得しQTextDocumentて操作することで、ほとんどの問題を解決できると思います。およびそのメソッド ( QTextFormat::property(int propertyId)など) は、テキストの多くのプロパティを取得するのに役立ちます。QGraphicsTextItemQTextDocument

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 に答える