所以我有QGraphicsScene
个各种项目。一些可以在场景中采用相同的坐标。当我显示场景时,顶部显示的是最后添加的场景。有没有办法让某个项目始终显示在顶部,甚至更好地使它在程序中重新出现在顶部(而不是删除它并再次添加)?我一直在考虑事先绘制所有内容,然后使用setVisible()
仅显示我想要的项目,但由于我想在线添加新内容,这似乎有点问题。
答案 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
参数,它就让我震惊。根据系统的不同,它可以是double
或float
,但这并不重要。我们可以简单地使用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)
这个问题有点令人困惑。主题提到在选择时需要顶部的项目,而描述则涉及更多永久性排序问题(创建等)。我添加了这个答案,以便为那些来到这里的人提供可能的解决方案:
zValue
可以设置为-100。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()