QGraphicsTextItem设置位置不生效、始终显示在QGraphicsWidget左上角问题求助
问题原因
- 你对
boundingRect()的修改操作完全无效:QGraphicsTextItem::boundingRect()返回的是临时的const QRectF副本,对副本的修改不会作用到item本身的属性。该属性是Qt内部根据文本内容、字体、文本宽度等参数自动计算的,普通使用场景下不需要手动修改,除非你继承QGraphicsTextItem重写该方法。 - 你给出的
setPos代码存在语法错误,末尾多了1个右括号,会导致编译阶段该语句不生效。 - 若语法修正后位置仍不对,大概率是你没有为
QGraphicsTextItem设置正确的父容器:setPos设置的坐标是相对于父item的坐标系,如果你需要把文本放在指定的QGraphicsWidget内,必须把该widget设置为textItem的父item,否则坐标是相对于整个QGraphicsScene的。 - 你写的打印代码本身存在错误:
textItem是指针类型,不能直接用.访问成员,且QGraphicsTextItem本身没有topLeft()、height()、width()这类直接返回boundingRect属性的方法,你打印的其实是未定义的错误值。
可行解决方案
直接按以下步骤编写代码即可,不需要手动修改boundingRect:
// 替换为你要放置文本的目标QGraphicsWidget指针 QGraphicsWidget* targetWidget = /* 你的QGraphicsWidget实例 */; // 构造时直接指定父item,坐标将自动基于targetWidget计算 QGraphicsTextItem* textItem= new QGraphicsTextItem(QString::number(i), targetWidget); textItem->setFont(QFont("Helvetica", 12)); textItem->setTextWidth(50); textItem->setDefaultTextColor(QColor(255, 255, 255)); // 修正语法错误,设置相对于targetWidget左上角的坐标 textItem->setPos(QPoint(300,300));
如果需要验证坐标是否符合预期,使用以下打印代码:
#include <QDebug> // 打印文本相对于父容器的坐标 qDebug() << "相对父容器坐标:" << textItem->pos(); // 打印文本在整个场景中的全局坐标 qDebug() << "场景全局坐标:" << textItem->scenePos(); // 打印文本自身的boundingRect参数 qDebug() << "自身尺寸范围:" << textItem->boundingRect();
可选调整(文本内部对齐)
如果需要调整文本在自身boundingRect内的对齐方式(比如居中、右对齐),添加以下代码即可:
QTextOption opt = textItem->document()->defaultTextOption(); opt.setAlignment(Qt::AlignCenter); // 按需修改为Qt::AlignLeft/Qt::AlignRight等 textItem->document()->setDefaultTextOption(opt); textItem->adjustSize();
内容的提问来源于stack exchange,提问作者begginer
相关产品推荐
相关产品推荐

