QtText | 使用QPainter在指定矩形框内绘制指定文本内容,文本可随矩形形变【搬运记录】

今天项目中需要在固定矩形框内绘制文本,要求文本能够随着矩形框的变化而变化。矩形框拉伸文字也要形变拉伸,使用QGraphicsTextItem无法实现这样的需求,因此考虑使用QPainter直接绘制。因为之前遇到过收藏的链接打不开的情况,故将使用方法的代码搬运到此。

搬运链接:如何使用QPainter缩放文本以适应边界框?

1 使用QPainter缩放文本适应指定边界框代码

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

2 QPainter的变换

3 QFontMetrics

posted @ 2022-10-18 22:23  YueLiGo  阅读(725)  评论(0编辑  收藏  举报