QT图形显示和处理5
有了之前的一些基础,现在开始讲图形项和场景。前面我花了整整两节来详细讲述了绘图的坐标系,大家一定要好好理解一下。
现在我们介绍场景和图元。我换一种讲解思路,讲完图元以后就开始直接讲场景坐标系统。
所谓图形项,比如你玩的坦克大战游戏,这个坦克可以随意运动,它整体就是一个图形项,它可以发出子弹,每个子弹也是图形项。我们可以定义一个图形项,然后把它放在场景里,并控制它的运动。
我们实现如下代码:(具体头文件大家包含一下就行了。)
QGraphicsScene *scene;
QGraphicsRectItem *item,*item2;
QGraphicsView *view ,*view2;
scene = new QGraphicsScene;
item = new QGraphicsRectItem(0, 0, 100, 100);
item2 = new QGraphicsRectItem(200, 100, 110, 100);
scene->addItem(item);scene->addItem(item2);
//第三个参数 const QTransform &deviceTransform
//if (scene.itemAt(30, 30, QTransform()) == item)
//DebugText::getDebugText()->addContents("right ! ");
scene->setForegroundBrush(QColor(255,255,0,100));
scene->setBackgroundBrush(QColor(255,0,0,120));
view = new QGraphicsView(scene);
view->setForegroundBrush(QColor(255, 255, 0, 100));
view->setBackgroundBrush(QPixmap("./ShowDebug/background.png"));
//view->resize(400, 300);
view->show();
view->setDragMode(QGraphicsView::RubberBandDrag);
view2 = new QGraphicsView(scene);
//view2->resize(400,300);
view2->setDragMode(QGraphicsView::ScrollHandDrag);
view2->show();
首先我们定义了一个场景,所谓场景,就是一片虚拟区域,这个区域是有坐标轴的,和之前的setWindow的坐标轴一样。然后你可以定义两个item,并通过addItem把它们放到场景中去。之后再通过:
scene->setForegroundBrush(QColor(255,255,0,100));
scene->setBackgroundBrush(QColor(255,0,0,120));
之后我们设置 QGraphicsView ,和之前的setViewport 相似,这里的view也代表了实际物理区域的坐标,最左上角是0,0.最右下角是(width(),height()),之后我们通过图片给view设置了背景。
view->setDragMode(QGraphicsView::RubberBandDrag);
这个函数是用来设置手型抓取移动屏幕的函数。以及后面有个类似的函数设置滚轮移动。
之间有两行函数:
if (scene.itemAt(30, 30, QTransform()) == item)
DebugText::getDebugText()->addContents("right ! ");
这个是用来查看在场景中30,30的图形项是不是我们之前定义的item,如果是就调试框显示一个right。
注意view2因为绑定的是scene,它的场景就全都是由scene构成的,而不像view对象一样里面有图片背景。
显示如下:
放大以后显示如下:
注意到这个view是由多个图片拼接形成的,现在的情况是因为我们没有设置view和scene的对应关系,所以QT自动把图形项显示在中心区域,而不是把scene的坐标原点定义在最中心(虽然图形项显示的不清楚,仔细看还是能看出来这两个正方形的)。左上的图形项的左上角对应场景区域的(0,0)点,也就是坐标原点,而再往左,场景区域的值就变为负值了。
我们下次就把scene和view定义在一起,这样就能让scene的坐标和view的坐标相等了。