0

テキストが常に QGraphicsItem の境界内に含まれるようにQGraphicsItem、特定の長さに基づいてa のサイズを変更する最も効果的な方法を探しています。テキストを読みやすいサイズで表示しながら、 をできるだけ小さくQStringするという考え方です。QGraphicsItem特定の幅のしきい値で複数の行に折り返すことも理想的です。例えば、

TestModule::TestModule(QGraphicsItem *parent, QString name) : QGraphicsPolygonItem(parent)
{
    modName = name;
    // what would be the best way to set these values?
    qreal w = 80.0; 
    qreal h = 80.0;
    QVector<QPointF> points = { QPointF(0.0, 0.0),
                                QPointF(w, 0.0),
                                QPointF(w, h),
                                QPointF(0.0, h) };
    baseShape = QPolygonF(points);
    setPolygon(baseShape);
}

void TestModule::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QBrush *brush = new QBrush(Qt::gray, Qt::SolidPattern);
    painter->setBrush(*brush);
    painter->drawPolygon(baseShape);
    painter->drawText(QPointF(0.0, 40.0), modName);
}

要件を機能させるためにコンストラクターに追加できるコードは何ですか? 文字列の全長に基づいて幅を設定し、各文字が占めるピクセル スペースを推測することが最も明白な解決策ですが、もう少しエレガントなものを探しています。何か案は?よろしくお願いします。

4

2 に答える 2

1

QFontMetrics クラスには、出力したい文字列を受け取り、QFontMetrics の初期化に使用した QFont に基づいて、文字列の QRect を返す boundingRect という関数があります。

ラップしたい場合は、文字列内の単語の最大数を計算して、boundingRect が QGraphicsItem の boundingRect 内に収まる QRect を返すことができるようにする必要があります。

于 2013-06-19T14:12:31.053 に答える