找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

第20篇 Qt5之2D绘图(十)图形视图框架(下)

yafeilinux 2017-5-23 18:06 12382人围观 yafeilinux原创

版权声明

该文章原创于Qt开源社区(www.qter.org),作者yafeilinux,转载请注明出处!可以到这里讨论该文章!


导语

环境:Windows 7 + Qt 5.8.0(包含Qt Creator 4.2.1)


正文


三、场景(QGraphicsScene

QGraphicsScene提供了图形视图框架的场景,它有以下功能:
  • 提供了一个管理大量图形项的快速接口
  • 向每个图形项传播事件
  • 管理图形项的状态,比如选择和焦点处理
  • 提供无转换的渲染功能,主要用于打印
        我们新建空的Qt项目(Empty qmake Project),项目名称为graphicsview03。然后在这个项目中添加新的C++ 源文件,命名为main.cpp,将main.cpp的内容更改如下。

#include <QtWidgets>

int main(int argc,char* argv[ ])

{

    QApplication app(argc,argv);

    QGraphicsScene scene;

    scene.addText("Hello, world!");

    QGraphicsView view(&scene);

    view.show();

    return app.exec();

}


        因为使用了Qt Widgets模块,所以需要在graphicsview03.pro文件中添加QT += widgets 一行代码。运行效果如下。

01.jpg

        这里使用addText()函数添加了一个文本图形项。执行这条语句就相当于执行了下面两条语句:

QGraphicsTextItem *item = new QGraphicsTextItem("Hello, world!");
scene.addItem(item);

        如果要删除一个图形项我们可以调用removeItem()函数,如:scene.removeItem(item);


(一)场景层

        一个场景分为三个层:图形项层(ItemLayer)、前景层(ForegroundLayer)和背景层(BackgroundLayer)。场景的绘制总是从背景层开始,然后是图形项层,最后是前景层。看下面的例子:
        我们在上面的程序中添加代码:

scene.setForegroundBrush(QColor(255, 255, 255, 100));
scene.setBackgroundBrush(Qt::green);

        运行程序,效果如下:

02.jpg


        对于前景层,我们一般不进行设置,或者像上面这样设置为半透明的白色。对于背景层,这里设置为了绿色,当然,我们也可以将一张图片设置为背景。

        scene.setBackgroundBrush(QPixmap("../graphicsview03/back.jpg"));

        运行程序,我们可以看到,图片默认是平铺的。


03.jpg


        如果想进一步控制前景和背景层,我们可以重新实现drawForeground()函数和drawBackground()函数。

(二)索引算法

        索引算法,是指在场景中进行图形项查找的算法。QGraphicsScene中提供了两种选择,它们在一个枚举类型QGraphicsScene::ItemIndexMethod中,分别是:
  • QGraphicsSecne::BspTreeIndex :应用Binary Space Partition tree,适合于大量的静态图形项。这个是默认值。
  • QGraphicsScene::NoIndex :不用索引,搜索场景中所有的图形项,适合于经常进行图形项的添加、移动和删除等操作的情况。
        我们可以使用setItemIndexMethod()函数进行索引算法的更改。

(三)边界矩形

        图形项可以放到场景的任何位置,场景的大小默认是没有限制的。而场景的边界矩形仅用于场景内部进行索引的维护。因为如果没有边界矩形,场景就要搜索所有的图形项,然后确定出其边界,这是十分费时的。所以如果要操作一个较大的场景,我们应该给出它的边界矩形。设置边界矩形,可以使用setSceneRect()函数。

(四)图形项查找


38人点赞鲜花

2人点赞握手

雷人

路过

1人点赞鸡蛋

刚表态过的朋友 (41 人)

原作者: yafeilinux

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!


关于进行手机实名认证的紧急通知!
按照有关部门要求,论坛类网站必须完成手机实名认证才可以进行发帖等操作。希望大家积极配合,为创建一个和谐文明的社区而贡献自己的力量。我们会对会员的隐私进行严格保密,对大家造成的不便深表歉意! 我知道了