【问题标题】:How to filter visible QGraphicsItems from QGraphicsScene in QGraphicsView?如何从 QGraphicsView 中的 QGraphicsScene 中过滤可见的 QGraphicsItems?
【发布时间】:2015-11-02 20:52:14
【问题描述】:

所以,如果我正确理解这一点,QGraphicsItem 是属于一个 QGraphicsScene(基本上是场景管理器)的(抽象)图形项。

QGraphicsView 是该场景的特定“视图”,多个视图可以查看同一场景。

如果我要在同一场景中查看 3 个视图,其中一个视图查看 1-5/10 个项目,其他 5-10/10 和第三个视图查看所有这些,我将需要一个场景和三个视图使用某种过滤器来绘制哪些项目。这可能吗?

如何过滤特定 QGraphicsView 中显示的 QGraphicsItems?

【问题讨论】:

    标签: c++ qt qgraphicsview qgraphicsitem qgraphicsscene


    【解决方案1】:

    这不可能直接进行,但使用视图场景(类似于视图模型)相当容易。

    项目可见性是场景的组成部分,而不是视图。这是有道理的:一旦你开始让场景改变项目属性,就永远不会有一个理智的地方可以停下来。接下来你想稍微移动一下物品,等等。所以这在当前的设计中根本不支持。

    您可以拥有一个包含所有项目的原型场景,然后是包含您希望可见的项目副本的视图场景(视图模型)。这些项目很小而且复制起来很便宜,所以即使在一个场景中有一千个项目,以这种方式实现它的成本也是微不足道的。只需创建一个工厂来复制您感兴趣的所有项目类型,然后在原型场景中运行它们,忽略您不希望显示的项目。

    【讨论】:

    • 如果我在图形项目上附加了一些逻辑,比如动画、附加颜色控件,该怎么办?从我现在控制一个项目的位置,我需要将该控制应用于项目列表,这对我来说听起来比它应该的更复杂。真的没有更好的办法吗?
    • @EdinM。没有更好的办法。可见性是项目的属性,项目可以在任何给定时间出现在一个场景中。您可以轻松地进行设置,以便视图场景项目镜像根场景中的项目。只需使用代理项目而不是项目副本。设置代理项目应该很容易,哎呀,甚至是根据需要自动创建代理项目的代理场景。这需要一点独创性,但由于itemChange 方法,它是可行的。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2012-05-29
    • 2020-10-17
    • 1970-01-01
    • 2011-04-10
    • 2015-10-20
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多