QtText | 使用QPainter在指定矩形框内绘制指定文本内容,文本可随矩形形变【搬运记录】
今天项目中需要在固定矩形框内绘制文本,要求文本能够随着矩形框的变化而变化。矩形框拉伸文字也要形变拉伸,使用QGraphicsTextItem无法实现这样的需求,因此考虑使用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();
}