2

QFontMetrics の「boundingRect」関数に問題があり、正しい結果が返されません。

    mfntArial = QFont("Arial", 12, QFont::Bold);
    QFontMetrics objMetrics(mfntArial);
    QRect rctLine = objMetrics.boundingRect("LOS");

デバッガーでは、rctLine には以下が含まれます。

    x1 : 1
    x2 : 26
    y1 : -16
    y2 : 4

これは非常に紛らわしいです。参照位置が渡されないため、x1 と y1 の両方が 0 であると予想し、x2 と y2 の両方が正であると予想します。

返された四角形は正しくありません。drawText と配置で使用すると、文字列の一部が表示されなくなります。

この関数が間違った結果を返す方法に関する他の投稿があることは知っていますが、これらを見てみましたが、役に立ちませんでした。

RedHat 7.2 で Qt5.6 を使用しています。

私も試しました:

    QRect rctParent = pobjParent->geometry();
    QRect rctLine = objMetrics.boundingRect(rctParent, intAlign, "LOS");

pobjParent は親ウィジェットで、rctParent には以下が含まれます。

    x1 : 8
    x2 : 289
    y1 : 24
    y2 : 447

intAlign には 33 が含まれます (左、上)

この場合、rctLine は以下を返します。

    x1 : 8
    x2 : 35
    y1 : 24
    y2 : 44

ただし、境界の四角形はまだ小さすぎて、レンダリング時に「S」の一部が欠落しています。

QFontMetrics に関する Qt の公式ドキュメント

4

1 に答える 1

0

最も幅の広い文字の 1 つである「M」の幅を計算することで、問題を解決しました。

    QRect rctCapM = objMetrics.boundingRect(rctParent, intAlign, "M");

次に、これを典型的なものとして使用し、他の文字列に必要な外接する四角形を計算します。

    QRect rctBounds(0, 0, rctCapM.width() * strLine.length(), rctCapM.height());

「strLine」には、表示して境界を計算する文字列が含まれていますが、これは私にとってはうまくいきます。

于 2016-06-20T13:20:48.667 に答える