【问题标题】:Qt: modifying z-order between two non-sibling graphical itemsQt:修改两个非同级图形项之间的 z 顺序
【发布时间】:2013-06-19 15:19:11
【问题描述】:

我有一个 QGraphicsScene,我在其中插入各种 QGraphicsItem 对象,例如矩形或多边形。这个想法是用一个 RectItem 表示每个组件的电子图,一个三角形的 PolygonItem 表示该组件的每个引脚,以及一个 PathItem 表示引脚之间的链接。

我很难找到正确排列我的项目的方法,因此链接总是隐藏在它们的起始引脚和结束引脚中。将链接隐藏在其起始引脚后面很容易,因为起始引脚始终是链接的父级,因此我可以在创建链接时设置标志 QGraphicsItem::ItemStacksBehindParent。但是对于末端引脚,我被卡住了。

我尝试将我的 pin 的 Z 值设置为它所附加的链接的上级值,或者调用 Qt 函数StackBefore(),但没有结果。文档告诉我,z-order 只涉及兄弟项目,即共享相同父项或都是顶级项目的项目。但是我所有的组件都是独立的,那么有没有办法改变两个非兄弟项目之间的堆栈顺序?

非常感谢您的帮助。

【问题讨论】:

  • 也许你应该使用一些自定义算法手动计算每个项目的 z-index,然后只使用QGraphicsItem::setZValue
  • @Riateche 你的意思是这样的吗? /** * Add the given link to the list of attached links (if it wasn't already added before) * @param l the link to add */ void Pin::addLink(Link * l) { if(!mLinks.contains(l)) { mLinks.append(l); if(l->zValue() >= zValue()) setZValue(l->zValue()+1); } } 因为那是我之前拥有的,但也是由于之前提到的原因而不起作用的解决方案之一。
  • 你说你所有的组件都是独立的,那么它们都是顶级项吗?在这种情况下,setZValue 应该可以工作。
  • @Riateche 好吧,不完全是,我没有很好地表达 myselkf(抱歉)。我想说我的所有组件(rect 项)都是独立的,因此是顶级项。管脚是组件的子级,每个发出信号的管脚都是相关链接的父级(换句话说,链接的父级具有其起始管脚)。但是,链接及其结束引脚不共享父项。
  • 如果您将所有项目设为顶级,z-ordering 将变得更加容易。你能做到吗?

标签: qt stack qgraphicsitem z-order siblings


【解决方案1】:

嗯,基于 Riateche cmets(谢谢),我能够找到解决问题的方法。

为了修改两个非同级项之间的堆叠顺序,并且因为它们没有共同的父项,我不得不更改它们最顶层的父项的 z 值,即顶级项。我没有试图将我的链接隐藏在它的末端引脚后面,而是制作了整个组件,即包含发出我的链接的引脚的那个,隐藏在另一个组件后面,它是末端引脚的父级。因为这两个组件是顶级项,所以setZValue 方法有效。

好吧,我同意它并没有真正回答最初的问题,因为最终,我不得不重新考虑这个问题才能使用两个同级/顶级项目,但这感觉就像是自然的做事方式,所以...我不认为真的存在改变两个非同级项之间的堆栈顺序的方法。

【讨论】:

    【解决方案2】:

    我建议创建没有父级的链接。
    然后对所有链接使用一个较低(范围)的 z-index,对所有组件使用一个较高(范围)的 z-index。
    这样,堆叠总是正确的,并且在图表中有(例如反馈)循环的情况下,您是安全的。

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多