这是一段非常基本的代码:
测量一段文本的大小。
在坐标 (100,25) 处绘制与此大小相对应的矩形。
在坐标 (100,25) 处显示文本。
auto str = "Hello, World!";
auto metrix = window->fontMetrics();
auto text = scene->addText(str);
text->setPos(100, 25);
text->setDefaultTextColor(Qt::white);
auto r = metrix.boundingRect(str);
int x, y, w, h;
r.getRect(&x, &y, &w, &h);
scene->addRect(100, 25, w, h, QPen(Qt::white));
代码中的scene
是一个QGraphicsScene
,没有特定的自定义,除了边框设置为零。
我希望文本正好在矩形内。然而,文本向左移动了几个像素,向底部移动了几个像素。为什么?
解决方案
如 @ NgocMinhNguyen 建议的那样,将文档边距设置为0
似乎可行,但这不是真正的解决方案,因为您会丢失边距。如果您可以获得实际的几何形状,包括边距等,那会更好。为此,您可以使用QGraphicsTextItem::boundingRect()
而不是QFontMetrics::boundingRect
。
实例
这是我为您编写的一个最小且完整的示例,以演示建议的解决方案:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QBoxLayout>
struct MainWindow : public QWidget
{
MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
QPointF p(100, 25);
auto *l = new QVBoxLayout(this);
auto *view = new QGraphicsView(this);
auto *textItem = new QGraphicsTextItem(tr("HHHHHHHH"));
auto *rectItem = new QGraphicsRectItem(textItem->boundingRect()
.adjusted(0, 0, -1, -1));
textItem->setPos(p);
rectItem->setPos(p);
view->setScene(new QGraphicsScene(this));
view->scene()->addItem(textItem);
view->scene()->addItem(rectItem);
l->addWidget(view);
resize(300, 300);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.sw();
return a.exec();
}
注意:请注意我是如何创建矩形的,两者之间是有区别的
auto *item = new QGraphicsRectItem(100, 25, w, h);
和
auto *item = new QGraphicsRectItem(0, 0, w, h);
item->setPos(100, 25);
后果
此示例生成以下结果:
QGraphicsTextItem
由QTextDoent
持有,它可以有一个margin。
将边距设置为 0,将正确绘制矩形。
text->doent()->setDoentMargin(0);
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(57条)