【发布时间】:2013-06-26 17:29:39
【问题描述】:
此问题与:Forcing QGraphicsItem To Stay Put
我希望在场景中移动时将QGraphicsItem 放在固定位置。
建议的解决方案是覆盖子类QGraphicsView 的void paintEvent(QPaintEvent*)。
void MyGraphicsView::paintEvent(QPaintEvent*) {
QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
myItem->setPos(scenePos);
}
但是,问题是我希望场景中的其他所有内容保持不变,即,如果我缩放或移动,我希望所有其他 QGraphicsItems 都以默认方式运行。
解决此问题的一种糟糕方法是从void MyGraphicsView::paintEvent(QPaintEvent*) 内部调用void QGraphicsView::paintEvent(QPaintEvent*)。
void MyGraphicsView::paintEvent(QPaintEvent* event) {
QGraphicsView::paintEvent(event);
QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
myItem->setPos(scenePos);
}
但是,这会为 my_item 添加闪烁行为,因为它首先使用 QGraphicsView::paintEvent(event); 定位,然后使用添加的代码
QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
myItem->setPos(scenePos);
问题是,我是否必须从头开始重新实现void MyGraphicsView::paintEvent(QPaintEvent*) 并为myItem 的所需行为和所有其他QGraphicsItems 的默认行为编写代码,或者有更简单的方法吗?这个?
谢谢。
【问题讨论】:
-
打电话给
setPos()之后为什么不打电话给paintEvent()? -
@Chris 效果会更差。在整个屏幕上显示该项目的痕迹。
-
您可以使用QGraphicsItem::itemChange 功能,看看您是否收到一些通知吗?也许
QGraphicsItem::ItemScenePositionHasChanged是您需要的。您必须启用QGraphicsItem::ItemSendsScenePositionChanges标志才能使其工作。
标签: c++ qt qgraphicsview qgraphicsitem qgraphicsscene