如何使用 QPainter 缩放文本以适合边界框
How to scale text to fit inside a bounding box with QPainter?
我需要在盒子上画一个标签。
理想情况下,我会用框的大小缩放标签,但我不确定是否有任何内置功能用于这种缩放。
目前,我正在将对象缩放到边界框的高度,但我不确定如何实现宽度缩放,因为绘制文本的宽度取决于符号的特定顺序(由于字距调整)。
这种扩展是否有一些内置功能?
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();
}
您可以使用 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();
}
相关文章:
- 文本文件中的单词链表
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何根据单词在文本中出现的概率输出单词
- std::当在256字节边界上写入整数时,流的奇怪行为
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 如何使用 QPainter 缩放文本以适合边界框