3

QPainter を使用して、QImage に複数行のテキストを描画しています。ただし、各キャラクターのバウンディング ボックスの周りに色付きの四角形を表示する必要もあります。

そのため、各キャラクターが描画されたときに持っていたバウンディング ボックスを知る必要があります。

たとえば、

painter.drawText(QRect(100, 100, 200, 200), Qt::TextWordWrap, "line\nline2", &r);

改行、ワードラップ、タブなどを考慮して、10個の長方形を取得する必要があります.

たとえば、改行のため、2 番目の長方形はの右側ではなく'l'、最初の の長方形の下になります。'l''e'

この写真の赤い四角形の座標のようなもの (手作業で配置したので、実際には正しい位置ではありません):

ここに画像の説明を入力

4

2 に答える 2

4

これは最善の解決策ではないかもしれませんが、私が考えることができる最善の解決策です。

「自分でやる」必要があると思います。つまり、テキストのブロックを描画する代わりに、各文字を一度に 1 つずつ描画します。次に、QFontMetrics を使用して、各文字の境界ボックスを取得できます。

ちょっとした作業ですが、それほど悪くはありません。次のようなもの(コードではなく疑似コード):

QFontMetrics fm(myFont, paintDevice);
int x = startX;
int y = startY;
for (unsigned int i = 0; i < numChars; i++)
{
    char myChar = mystr[i];  // get character to print/bound
    QRect rect = fm.boundingRect( myChar );   // get that char's bounding box
    painter.drawText(x, y, Qt::TextWordWrap, mystr[i], &r);  // output char
    painter.drawRect(...); // draw char's bounding box using 'rect'
    x += rect.width();     // advance current position horizontally

    // TODO:
    // if y > lineLen      // handle cr
    //     x = startX;
    //     y += line height

}

QFontMetrics を確認してください。境界ボックス、最小境界ボックスなどを取得するためのさまざまな方法があります。

QFontMetrics 4.7

ああ...使用しているオーバーロードが実際の境界四角形を返すことがわかりました。それを使用して、必要に応じて QFontMetrics をスキップできます。それ以外の場合、全体的なアルゴリズムは同じです。

于 2012-11-13T18:59:02.190 に答える