美文网首页技术干货程序员
QT:QGraphicsView QGraphicsScene

QT:QGraphicsView QGraphicsScene

作者: y4ngyy | 来源:发表于2018-09-02 17:11 被阅读3398次

    最近使用QT来编写一个可局域网联机对战的小游戏,主要使用GraphicsView来实现游戏界面,游戏动画方面由于坐标系和函数机制方面的不了解,做起来有点蛋疼,用了一下午和同伴一起写demo、查资料,大致理清了头绪,整理一下理解。

    QGraphicsView 和 QGraphicsScene的坐标系

    QGraphicsView一般用法是要setScene(QGraphicsScene&)绑定一个Scene对象。QGraphicsScene的坐标系是这样的:

    TIM图片20180902160658.png 当将QGraphicsView与QGraphicsScene绑定时,QGraphicsScene的坐标原点并不是在窗口的左上角,而是左上角向右下偏离一点点。 查询资料后的解决方法是将Scene的大小设置大于或等于View的大小,这时Scene的坐标原点会自动移到显示的窗口左上角,这是View上会出现滑动条。由于做的小游戏,游戏界面带有滑动条很蛋疼,所以大小设置为相同的,却依然有滑动条,又查了一番资料后的解决方法为:设置View的样式表setStyleSheet("padding: 0px; border: 0px;") 从而恍然大悟,QGraphicsView默认带有内边距和边界…… TIM图片20180902163333.png

    QGraphicsItem的坐标机制

    Item坐标系的x轴、y轴、原点的关系跟Scene一样。在QGraphicsItem中有几个重要的函数,分别是boundingRect()shape()paint(),这函数绘图都是基于Item的坐标系,着重强调,基于的原点是Item坐标系的原点,使用paint()来绘制Item时需要注意。而Item坐标系的原点又是一个大坑。
    在Scene使用addItem()添加Item时,添加的Item的坐标系原点默认在画面的中央,可以调用setPos(x,y)函数来重设Item坐标系原点,这时Item坐标系原点处于设置的x、y处。

    QGraphicsItem的重绘

    Item的重绘可以在Scene中调用Invalidate(flag)来重绘Item层,也可以在Item中调用update()。此时的重绘会发生在boundingRect()函数返回的矩形区域中,同时这个矩形区域也是响应事件的区域,在没有重载shape()的情况下还会用于碰撞检测。
    使用prepareGeometryChange()函数可以修改boudingRect()返回的矩形区域大小,同时还会根据情况来重绘视图。

    动画实现tip

    • 可以继承QGraphicsObject类,这个类多重继承QObject和QGraphicsItem可以重载timeEvent()来定时重绘实现动画。
    • 可以在QGraphicsScene中重载timeEvent() 并将Item的刷新函数封装为public在Scene中调用,实现多Item同步刷新。

    相关文章

      网友评论

        本文标题:QT:QGraphicsView QGraphicsScene

        本文链接:https://www.haomeiwen.com/subject/ademwftx.html