Как масштабировать текст, чтобы он поместился внутри ограничительной рамки с помощью QPainter? - PullRequest
0 голосов
/ 10 января 2019

Мне нужно нарисовать ярлык на коробке.

В идеале я бы масштабировал метку в соответствии с размером поля, но я не уверен, есть ли какие-либо встроенные функции для такого типа масштабирования.

В настоящее время я масштабирую объект до высоты ограничивающего прямоугольника, но я не уверен, как реализовать масштабирование ширины, потому что ширина нарисованного текста зависит от определенного порядка символов (из-за кернинга) ,

Есть ли встроенная функциональность для такого масштабирования?

void total_control_roi_item::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
    QGraphicsRectItem::paint(painter, option, widget);
    painter->save();
    const auto rect = boundingRect();
    auto font = painter->font();
    auto height_of_box = rect.height()*0.7;
    font.setPointSizeF(height_of_box);
    painter->setFont(font);
    const auto label = QString("%1").arg(id_);
    painter->drawText(rect, label, Qt::AlignHCenter | Qt::AlignVCenter);
    painter->restore();
}

1 Ответ

0 голосов
/ 10 января 2019

Вы можете сделать эскалацию текста, используя информацию QFontMetrics.

#include <QtWidgets>

class RectItem: public QGraphicsRectItem
{
public:
    using QGraphicsRectItem::QGraphicsRectItem;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
    {
        const QString id_ = "Stack Overflow";
        const auto label = QString("%1").arg(id_);
        QGraphicsRectItem::paint(painter, option, widget);
        if(label.isEmpty()) return;
        const auto rect = boundingRect();
        QFontMetrics fm(painter->font());
        qreal sx = rect.width()*1.0/fm.width(id_);
        qreal sy = rect.height()*1.0/fm.height();
        painter->save();
        painter->translate(rect.center());
        painter->scale(sx, sy);
        painter->translate(-rect.center());
        painter->drawText(rect, label, Qt::AlignHCenter | Qt::AlignVCenter);
        painter->restore();
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QGraphicsScene scene;
    QGraphicsView w(&scene);
    scene.addItem(new RectItem(0, 0, 300, 200));
    w.resize(640, 480);
    w.show();

    return a.exec();
}
...