gpt4 book ai didi

c++ - Qt中文本的定位规则到底是什么?

转载 作者:行者123 更新时间:2023-12-03 06:57:08 24 4
gpt4 key购买 nike

这是一段非常基本的代码:

  1. 测量一段文本的大小。
  2. 在坐标 (100, 25) 处绘制对应于该尺寸的矩形。
  3. 在坐标 (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));

代码中的场景是一个没有特定定制的QGraphicsScene,除了边框设置为零。

我希望文本正好位于矩形内。然而,文本向左移动了几个像素,并向底部移动了几个像素。为什么?

enter image description here

最佳答案

解决方案

按照@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.show();
return a.exec();
}

注意:请注意我是如何创建矩形的。有区别

auto *item = new QGraphicsRectItem(100, 25, w, h);

auto *item = new QGraphicsRectItem(0, 0, w, h);
item->setPos(100, 25);

结果

此示例产生以下结果:

Text in a bounding rectangle

关于c++ - Qt中文本的定位规则到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64378577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com