QT:QGraphicsView QGraphicsScene QGraphicsItem理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT:QGraphicsView QGraphicsScene QGraphicsItem理解相关的知识,希望对你有一定的参考价值。

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

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

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

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

github项目

如何用鼠标动态调整 QHBoxLayout 和 QGraphicsView 大小? (Python,Pyqt4)

【中文标题】如何用鼠标动态调整 QHBoxLayout 和 QGraphicsView 大小? (Python,Pyqt4)【英文标题】:How adjust QHBoxLayout and QGraphicsView size dynamically with the mouse ? (Python, Pyqt4) 【发布时间】:2017-05-20 05:47:57 【问题描述】:

我正在努力寻找解决问题的方法。 我正在尝试修改分配给窗口中两个图形场景的空间。 准确地说。我有一个 QHBoxLayout,我在其中放置了两个 QGraphicsView 以在其中绘制一些东西。这两个场景并排(垂直)放置。我想做的是用鼠标在两个场景之间单击以调整每个视图的空间。如果我向上移动鼠标,那么顶部场景的高度会变小,而底部场景的高度会变大。

现在我有以下代码:

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from PyQt4 import QtGui
import sys

class SurfViewer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()

        # General Window
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX_param_scene = QtGui.QHBoxLayout()
        # list group view side
        self.plotview = QtGui.QGroupBox("Group of views")
        self.layout_plotview = QtGui.QVBoxLayout()
        # views 
        self.mascenegrid = QtGui.QGraphicsView(self) 
        self.mascenelfp = QtGui.QGraphicsView(self)
        # add widjets
        self.layout_plotview.addWidget(self.mascenegrid)
        self.layout_plotview.addWidget(self.mascenelfp)
        # set layout 
        self.plotview.setLayout(self.layout_plotview)
        self.mainHBOX_param_scene.addWidget(self.plotview)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = SurfViewer(app) 
    ex.show()
    sys.exit(app.exec_())

所以我得到了这个结果。

我想做的是根据哪个视图需要更多空间单击并向上或向下拖动中间的灰色条。 如果有人对此有解决方案,那就太好了。 祝你有美好的一天!

【问题讨论】:

【参考方案1】:

使用QSplitter:

    # add widgets
    self.splitter = QtGui.QSplitter(QtCore.Qt.Vertical)
    self.splitter.addWidget(self.mascenegrid)
    self.splitter.addWidget(self.mascenelfp)
    self.layout_plotview.addWidget(self.splitter)

【讨论】:

帅,正是需要的!

以上是关于QT:QGraphicsView QGraphicsScene QGraphicsItem理解的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QT 中的 QgraphicsView 中保持图像原始

Qt - 如何将 QGraphicsScene 缩放到 QGraphicsView

使用 Qt 的 QGraphicsScene/QGraphicsView 进行 2D 游戏

Qt - QGraphicsScene 和 QGraphicsView 不更新更改?

QT中QGraphicsView中的手指滚动?

Qt 部署 - QGraphicsView 不显示在其他机器上