【问题标题】:How to scale text to fit inside a bounding box with QPainter?如何使用 QPainter 缩放文本以适合边界框?
【发布时间】:2019-01-10 18:50:41
【问题描述】:

我需要在一个盒子上画一个标签。

理想情况下,我会根据盒子的大小来缩放标签,但我不确定是否有任何内置功能可用于这种缩放。

目前我正在将对象缩放到边界框的高度,但我不确定如何实现宽度缩放,因为绘制文本的宽度取决于符号的特定顺序(由于字距调整) .

这种缩放是否有一些内置功能?

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

【问题讨论】:

    标签: c++ qt qt5 qgraphicsrectitem


    【解决方案1】:

    您可以使用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();
    }
    

    【讨论】:

    • 太棒了!我不得不调整 auto s = qMin(sx, sy); 以获得例外的缩放行为。
    • @Mikhail 我知道您想缩放宽度和高度,并且没有必要考虑纵横比。
    • 是的。如果我回到这个问题,我只是想给自己留个便条:-)
    猜你喜欢
    • 2012-04-17
    • 2018-08-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多