在Qt中,QGraphicsScene
本身并没有一个直接的“设置坐标”的方法,因为场景的坐标系统是由其内部的图形项(如QGraphicsItem
对象)的位置和变换来定义的。但是,你可以通过添加、移动或变换场景中的图形项来间接地“设置”或改变场景中的内容布局。
以下是一个简单的例子,说明如何在QGraphicsScene
中添加图形项,并设置它们的位置(坐标):
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个QGraphicsScene对象
QGraphicsScene scene;
// 创建一个QGraphicsRectItem对象,并设置其位置和大小
QGraphicsRectItem *rect1 = new QGraphicsRectItem(QRectF(0, 0, 100, 100));
rect1->setPos(50, 50); // 设置矩形项在场景中的位置(坐标)
scene.addItem(rect1); // 将矩形项添加到场景中
// 创建另一个QGraphicsRectItem对象,并设置其位置和大小
QGraphicsRectItem *rect2 = new QGraphicsRectItem(QRectF(0, 0, 100, 100));
rect2->setPos(200, 200); // 设置另一个矩形项在场景中的位置(坐标)
rect2->setBrush(Qt::red); // 设置填充颜色为红色,以便区分
scene.addItem(rect2); // 将矩形项添加到场景中
// 创建一个QGraphicsView对象来显示场景
QGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿渲染提示
view.setBackgroundBrush(QPixmap(":/images/cheese.jpg")); // 设置背景图片(可选)
view.show(); // 显示视图
return app.exec();
}
在这个例子中,我们创建了两个QGraphicsRectItem
对象,并分别设置了它们在场景中的位置(通过setPos()
方法)。然后,我们将这两个矩形项添加到QGraphicsScene
对象中。最后,我们创建了一个QGraphicsView
对象来显示这个场景。
请注意,这个例子中的坐标是相对于场景左上角的,即场景的原点(0,0)位于左上角。setPos()
方法用于设置图形项在场景中的位置。在这个例子中,第一个矩形被设置在(50,50)的位置,而第二个矩形被设置在(200,200)的位置。
另外,QRectF(0, 0, 100, 100)
定义了一个矩形的大小,其左上角位于(0,0),宽度和高度均为100。但是,这个矩形在场景中的最终位置是由setPos()
方法确定的。
上面,QRectF(0, 0, 100, 100)里的0, 0表示的是坐标吗
是的,QRectF(0, 0, 100, 100)
中的前两个参数0, 0
表示矩形左上角的初始坐标。在这个例子中,0, 0
是矩形左上角的x和y坐标,意味着矩形的左上角在创建时是位于原点的。然而,这个矩形的最终位置在QGraphicsScene
中是由setPos()
函数来确定的。
当你创建一个QGraphicsRectItem
并给它一个QRectF
来定义其大小和初始位置时,这个初始位置是相对于图形项自己的局部坐标系的。但是,当你将这个图形项添加到QGraphicsScene
中并使用setPos()
设置其位置时,你是在指定图形项在场景坐标系中的位置。
所以,在QRectF(0, 0, 100, 100)
中的0, 0
是图形项内部坐标系的原点,而setPos(50, 50)
则是将这个图形项放置在场景坐标系的(50, 50)
位置。这样,即使矩形的左上角在其自身坐标系中是(0, 0)
,在场景中它实际上会出现在(50, 50)
的位置。
这时候我获取QGraphicsRectItem坐标,会是(0, 0),还是(50, 50)
当你获取一个QGraphicsRectItem
的坐标时,你得到的坐标值取决于你使用的方法。
-
局部坐标:如果你直接查询图形项(如
QGraphicsRectItem
)的坐标,通常得到的是该图形项在其自身局部坐标系中的位置。在这种情况下,由于QRectF(0, 0, 100, 100)
定义了矩形的局部位置和大小,其左上角的局部坐标仍然是(0, 0)
,这是相对于图形项自身坐标系的。 -
场景坐标:如果你想获取图形项在
QGraphicsScene
中的坐标,即场景坐标,你需要使用QGraphicsItem
的pos()
方法。这个方法返回的是图形项在场景中的位置,考虑到之前通过setPos(50, 50)
设置了位置,pos()
将返回QPointF(50, 50)
。
所以,回答你的问题:
- 如果你查询的是图形项的局部坐标(例如,通过
rect()
方法获取其边界矩形),你将得到(0, 0)
作为左上角的坐标。 - 如果你查询的是图形项在场景中的坐标(通过
pos()
方法),你将得到(50, 50)
。
这两种坐标系统是不同的,局部坐标是相对于图形项自身的,而场景坐标是相对于整个场景的。
在QRectF(0, 0, 100, 100)中的0, 0,是矩形在QGraphicsRectItem内部的坐标,对吗
是的,您是正确的。在QRectF(0, 0, 100, 100)
中的0, 0
指的是矩形在其自身的局部坐标系中的左上角坐标。换句话说,这是矩形在QGraphicsRectItem
内部的坐标。这个矩形是相对于QGraphicsRectItem
的左上角来定位的,其左上角坐标被设定为(0, 0)
。
当您创建一个QGraphicsRectItem
并给它指定一个QRectF
时,您实际上是在定义这个图形项的形状和它在自身坐标系中的位置。然而,这个图形项在QGraphicsScene
中的绝对位置是通过setPos()
方法来设置的。
所以,QRectF(0, 0, 100, 100)
定义了矩形的形状和大小,以及矩形在QGraphicsRectItem
内部(或说是在其局部坐标系中)的位置,而setPos()
则用来设置QGraphicsRectItem
在QGraphicsScene
中的位置。