QGraphicsScene位置异常:QGraphicsRectItem定位不符合预期
解决QGraphicsRectItem无法定位到预期位置的问题
看起来你碰到的问题是QGraphicsView的默认行为在搞鬼——默认状态下,视图会把整个场景居中显示,哪怕你把矩形放在场景的(0,0)坐标,视图也会自动调整视角,让这个只有100x100大小的小场景居中在屏幕上,最终导致矩形出现在中间位置。
下面给你几个针对性的解决办法,你可以根据自己的需求来选:
1. 修改视图的对齐方式
这是最直接的解决方案。QGraphicsView默认的对齐方式是Qt::AlignCenter,我们把它改成左上对齐,这样场景的(0,0)坐标就会和视图的左上角完全重合:
// 假设你的视图对象是view view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
2. 手动设置场景的sceneRect
如果不手动指定场景范围,QGraphicsScene会自动计算所有item的边界作为sceneRect。当场景里只有一个小矩形时,视图就会把这个小场景居中显示。手动设置sceneRect可以明确场景的范围,再配合对齐方式就能让矩形回到你预期的位置:
// 假设你的场景对象是scene scene->setSceneRect(0, 0, 800, 600); // 宽高可以根据你的实际需求调整
3. 检查是否有自动适配视图的代码
如果你调用过view->fitInView()这类函数,它会自动缩放场景以适配视图大小并居中,这也会导致矩形位置不符合预期。如果有这类代码,可以调整它的参数来避免居中:
// 保留fitInView功能,但设置左上对齐 view->fitInView(scene->sceneRect(), Qt::AlignLeft | Qt::AlignTop);
结合你的代码,修改后的完整示例大概是这样:
// 初始化场景和视图 QGraphicsScene* scene = new QGraphicsScene(this); QGraphicsView* view = new QGraphicsView(scene, this); view->setAlignment(Qt::AlignLeft | Qt::AlignTop); scene->setSceneRect(0, 0, 800, 600); // 你的矩形绘制代码 QColor neki1(23, 145, 195); QPen pen1(neki1, 2, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin); QGraphicsRectItem* sel = new QGraphicsRectItem(0,0,100,100); sel->setPen(pen1); sel->setBrush(Qt::transparent); scene->addItem(sel);
调整之后,你的矩形应该就能出现在视图的左上角(也就是你预期的(0,0)位置)了。
内容的提问来源于stack exchange,提问作者Tim Retelj
相关产品推荐
相关产品推荐

