Qt:选择的项目出现在QGraphicsScene的顶部

时间:2014-06-15 15:38:48

标签: c++ qt qgraphicsview qgraphicsitem qgraphicsscene

所以我有QGraphicsScene个各种项目。一些可以在场景中采用相同的坐标。当我显示场景时,顶部显示的是最后添加的场景。有没有办法让某个项目始终显示在顶部,甚至更好地使它在程序中重新出现在顶部(而不是删除它并再次添加)?我一直在考虑事先绘制所有内容,然后使用setVisible()仅显示我想要的项目,但由于我想在线添加新内容,这似乎有点问题。

5 个答案:

答案 0 :(得分:6)

您可以使用QGraphicsItem::setZValue ( qreal z )设置项目的Z值。 Z值决定兄弟项目的堆叠顺序。具有较高Z值的项目将始终绘制在具有较低Z值的另一项目的顶部。默认Z值为零。因此,您可以将其设置为更高的值以将其置于最佳位置:

item->setZValue(1);

或将其置于其他项目的底部:

item->setZValue(-1);

答案 1 :(得分:2)

在做了一些研究之后,我认为@Leslie的答案比@Nejat的答案更正确。但是,如果您拥有很多项,效率非常低,而且您必须经常进行检查。

我的情况我有一个QGraphicsTextItem,它显示了我场景中光标的坐标。

void QCVN_SceneView::mouseMoveEvent(QMouseEvent *event)
{
  QPointF cursorPoint = mapToScene(event->pos());
//  cout << "Event pos: x=" << event->pos().x() << ", y=" << event->pos().y() << endl;
//  cout << "Event pos (in scene): x=" << cursorPoint.x() << ", y=" << cursorPoint.y() << endl;

  QString coords = QString("%1, %2")
                          .arg(cursorPoint.x())
                          .arg(cursorPoint.y());

  cursorSceneCoords->setPlainText(coords);
  cursorSceneCoords->setPos(cursorPoint);

  QGraphicsView::mouseMoveEvent(event);
}

显然,如果我使用setZValue(1)在场景中有10000000个项目,那么除非所有项目的z-value都在1以下,否则不会这样做。迭代整个项目列表也是一个糟糕的方法这样做。

我给了它一点思考,一旦我记得setZValue()使用qreal参数,它就让我震惊。根据系统的不同,它可以是doublefloat,但这并不重要。我们可以简单地使用std::numeric_limits来获得非常非常高的价值。当然,我们必须限制场景中的所有项目(除了我们想要的顶部之外)最大可能值<{1>}最大可能值减去 1(或0.1或其他) )。所以,如果你这样做

z-value

该项目将始终位于其余部分之上。

答案 2 :(得分:1)

检查

http://www.qtcentre.org/threads/5428-help-with-ZValue!!

// Find largest Z
qreal maxZ = 0;
foreach (QGraphicsItem *item, 
        clickedItem>collidingItems(Qt::IntersectsItemBoundingRect))
    maxZ = qMax(maxZ, item->zValue());

// Assign new Z
clickedItem->setZValue(maxZ + some);

答案 3 :(得分:1)

这个问题有点令人困惑。主题提到在选择时需要顶部的项目,而描述则涉及更多永久性排序问题(创建等)。我添加了这个答案,以便为那些来到这里的人提供可能的解决方案:

  • 永久订单深度管理setZValue是可行的方法。例如,具有组背景的节点视图,其中背景应始终位于所有其他项后面,zValue可以设置为-100。
  • 对于临时排序,例如选择,您不想弄乱永久排序(应该为用户设置或特定于应用程序的订单状态需求保留),您可以使用{{3} }。这将在同一 zDepth 中更改项目 的顺序。 因此,当选择项目时,您可以浏览所有项目并调整顺序,并且您不必担心尝试将zDepth重置为完成之前的状态(我想您仍然可以恢复,但至少这种方式的问题与zDepth分开。请注意,FWIW,我发现stackBefore的{​​{1}}顺序感到倒退。

答案 4 :(得分:0)

https://github.com/sonichy/HTYPaint2/blob/master/mainwindow.cpp#L775

    # Open the file in read mode
with open('chocolate.txt', 'r') as file:
    input_col = file.read().replace(',', '')

text3 = input_col.replace('.', '')
text2 = text3.replace('"', '')
text = text2.split()