You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QGraphicsTextItem部分显示 调整boundingRect无效宽度恒为8

问题成因
  • 你对boundingRect()的使用逻辑完全错误:该方法是const只读接口,返回的是图元当前边界矩形的临时副本,你对这个临时对象调用adjust()没有任何实际作用——临时对象会在语句执行完直接销毁,根本不会修改图元内部存储的真实边界参数,这就是你两次打印宽度都是8的直接原因。
  • 自定义的RandomNumber类对boundingRect()的重写存在错误:原生QGraphicsTextItem在调用setPlainText()后,会自动根据文本内容、当前设置的字体计算匹配的正确边界尺寸,不可能出现宽度仅8px的情况(8px连单个英文字母都无法完整显示),这个固定8的宽度基本是你重写接口时写死的返回值,完全没参考文本的实际渲染尺寸。
  • 代码存在多处拼写/API调用错误:比如setPostion是错误拼写,QGraphicsItem设置位置的正确接口是setPos();还有sce[n][1]e->addItem属于手滑的笔误,正常编译都无法通过。
  • 额外说明:图形视图框架是根据每个图元返回的boundingRect()判断哪些区域需要绘制、哪些区域在视口外可以跳过,你返回的边界宽度只有8,框架就只会绘制这8px宽度的区域,剩下的文本内容因为被判定在图元边界外,会被直接裁剪掉,就出现了你截图里只显示最左侧几列像素的现象,和遮挡没有关系。
解决方法
  • 不要尝试从图元外部修改boundingRect()的返回值,这个接口只用来给框架提供图元的边界信息,必须在自定义图元类内部重写时返回正确值,外部调用仅能读取不能修改。
  • 如果你的RandomNumber继承自QGraphicsTextItem,不需要手动计算文本的边界尺寸,重写boundingRect()时直接返回父类计算好的结果即可,不要返回写死的固定值,基础写法参考:
// 头文件中声明重写
QRectF boundingRect() const override;

// cpp中实现
QRectF RandomNumber::boundingRect() const
{
    // 直接取父类计算好的文本边界即可,有自定义绘制需求再额外加边距
    return QGraphicsTextItem::boundingRect();
}
  • 如果确实需要给文本增加额外边距,重写boundingRect()时在父类返回值的基础上调整即可,注意要用adjusted()生成调整后的新矩形返回,不要对临时值调用adjust(),尺寸变更前必须调用prepareGeometryChange()通知框架更新边界缓存,示例:
QRectF RandomNumber::boundingRect() const
{
    // 给文本四周增加10px边距
    return QGraphicsTextItem::boundingRect().adjusted(-10, -10, 10, 10);
}
  • 修正代码里的API调用错误:设置图元位置用randNum->setPos(2100,2100);,修正场景对象的笔误,确保代码能正常编译运行。
  • 额外排查项:如果调用过setTextWidth()设置文本宽度,确保传入值大于0,传0会强制文本仅按换行符断行,也可能引发尺寸计算异常。

问题示意图

内容的提问来源于stack exchange,提问作者user19161382

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:48:11