C++ 如何从QGraphicsView中的QGraphicscene中筛选可见的QGraphicsSitem?

C++ 如何从QGraphicsView中的QGraphicscene中筛选可见的QGraphicsSitem?,c++,qt,qgraphicsview,qgraphicsitem,qgraphicsscene,C++,Qt,Qgraphicsview,Qgraphicsitem,Qgraphicsscene,如果我没弄错的话,QGraphicsItem是属于一个qgraphicscene(基本上是场景管理器)的(抽象)图形项 QGraphicsView是该场景的特定“视图”,多个视图可以查看同一场景 如果我要在同一场景中查看3个视图,其中一个视图查看1-5/10个项目,其他5-10/10和第三个视图查看所有项目,我将需要一个场景和三个视图,并使用某种过滤器绘制哪些项目。这可能吗 如何筛选特定QGraphicsView中显示的QGraphicsSitem?不可能直接进行筛选,但使用viewscenes

如果我没弄错的话,QGraphicsItem是属于一个qgraphicscene(基本上是场景管理器)的(抽象)图形项

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

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


如何筛选特定QGraphicsView中显示的QGraphicsSitem?

不可能直接进行筛选,但使用viewscenes(类似于viewmodels)非常容易

项目可见性是场景的一个组成部分,而不是视图。这是有道理的:一旦你开始让场景改变物品属性,就再也没有一个理智的地方可以停下来。接下来,您需要稍微移动项目,等等。因此,当前的设计不支持这种方式


您可以创建一个包含所有项目的原型场景,然后创建包含希望可见项目副本的viewscenes(viewmodels)。这些项目很小,复制成本也很低,因此即使场景中有1000个项目,以这种方式实现它的成本也很小。只需创建一个工厂,复制您感兴趣的所有项目类型,并在原型场景中运行它们,忽略您希望不显示的项目。

如果我将一些逻辑附加到图形项目,如动画、其他颜色控件,该怎么办?从我现在控制一个项目的地方,我需要在项目列表上应用那个控制,这听起来比它应该的更复杂。“真的没有更好的办法吗?”爱迪姆说。没有更好的办法了。可见性是项目的属性,项目可以在任何给定时间位于一个场景中。您可以轻松地进行设置,以便viewscene项目镜像根场景中的项目。只需使用代理项而不是项副本。设置代理项(heck)应该很容易,甚至可以根据需要自动创建代理项的代理场景。这需要一些独创性,但由于
itemChange
方法,它是可行的。