Qt:创建自己的Qgraphicscene/s的最佳过程

Qt:创建自己的Qgraphicscene/s的最佳过程,qt,qgraphicsview,qgraphicsitem,qgraphicsscene,Qt,Qgraphicsview,Qgraphicsitem,Qgraphicsscene,我正在制作分形创造者软件。因此,我需要一个场景,每个分形和这些场景需要“分层”,因为缩放橡皮筋 我已经尝试过用“widget”的方式编写它,所以我有一个自定义的widget叫做“canvas”。在canvas类中,我重写了paintEvent,并在该事件中渲染了当前分形。每当有人用另一个分形单击菜单时,我调用update()方法并渲染新的分形。为了缩放,我使用了鼠标事件的覆盖和画布的update()。第一次我重新画了整个画布,但是画得很慢。之后,我只重涂了橡皮筋下的部分,但当我想选择一些更大的区

我正在制作分形创造者软件。因此,我需要一个场景,每个分形和这些场景需要“分层”,因为缩放橡皮筋

我已经尝试过用“widget”的方式编写它,所以我有一个自定义的widget叫做“canvas”。在canvas类中,我重写了paintEvent,并在该事件中渲染了当前分形。每当有人用另一个分形单击菜单时,我调用update()方法并渲染新的分形。为了缩放,我使用了鼠标事件的覆盖和画布的update()。第一次我重新画了整个画布,但是画得很慢。之后,我只重涂了橡皮筋下的部分,但当我想选择一些更大的区域和其他重涂问题时,速度仍然很慢

所以我一直在寻找另一种方法。层。我已经找到了QStackedWidget,但我没有找到方法使我的层和顶层都可见,使其透明。之后,我找到了QGraphicscene,这似乎是最好的方法。但我不知道做这件事的正确程序。以下是我正在考虑的两个程序:

  • 创建QGraphicsView
  • 画布将是QGraphicscene,而不是小部件
  • 我将覆盖一些QGraphicscene事件(但我不知道哪个-drawItems()已过时,覆盖更新()对我来说似乎是错误的,但可能…)
  • 当选择其他分形时,我将通过调用update()重新绘制画布,方法与我的“小部件”解决方案相同
  • 在前景层将缩放橡皮筋
  • 或:

  • 创建QGraphicsView
  • 画布将是QGraphicscene,而不是小部件
  • 每个分形都将是QGraphicsItem的子对象
  • 当选择其他分形时,我将删除旧的分形 项并将其替换为新项,可能会调用invalidate()
  • 在前景层将缩放橡皮筋-我想,这 这是qgraphicscene的常见行为,不是吗
  • 我的理由之一正确吗?你还有别的建议吗?分形在计算中很复杂,只有在必要时才重新绘制是非常重要的。你能帮帮我吗

    谢谢:-)

    编辑:“缩放橡皮筋”说明:

    我为我的表达“变焦橡皮筋”感到抱歉。这意味着缩放橡皮筋所做选择下方的区域-缩放方式与Photoshop CS5中的方式相同(例如)。我想知道选择这种方式时场景的哪一部分被重新绘制。如果重新绘制了整个场景,或选定区域下方的部分场景,或没有重新绘制任何内容,则在单独的层中进行橡皮筋选择


    我希望我的解释能有所帮助:-)。

    在Qt中,Qgraphicscene可以被看作是一个项目的世界,QGraphicsView是一个进入这个世界的窗口。因此,您应该基于QGraphicsItem(或者QGraphicsObject,如果您想要信号和插槽),向QGraphicscene添加项目

    在您的情况下,我将创建一个从QGraphicsItem继承的分形类,并将其添加到场景中。确保覆盖必要的纯虚拟函数,如和

    不要在paint函数中计算分形代码。我建议分形类存储一个QPixmap(如果在像素级绘制,则为QImage)并将分形渲染到这个级别。然后,在paint函数中,分形类通过调用or来呈现QPixmap的内容;在这种情况下,以相关者为准


    至于缩放,您的分形类可以响应缩放,适当更改内部表示的渲染。

    好的,谢谢。那橡皮筋呢?它是否以“层”的方式工作?那么,当我打开橡皮筋时,它是否在另一层,然后是我的物品?我的意思是,当橡皮筋方格调整尺寸时,方格下方的项目是否重新喷漆?整个场景都重新粉刷过了吗?单词“缩放橡皮筋”并没有给我足够的信息来理解你在用橡皮筋做什么。你能详细说明一下你的问题吗?请注意,QGraphicsView支持橡皮筋选择,如果这有助于: