c++ 防止“后台项”上的QGraphicsItem::itemAt()

cedebl8k  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(152)

我试图建立一个使用插件的图形用户界面。在我目前的阶段,我需要用户点击并指定点的位置。
我设置的插件架构要求插件返回插件希望使用的QGraphicsItem。在主程序中(未来的插件编写者将无法访问),我设置了一个背景图片来引导点击。插件可以偷偷地访问场景()使用项目更改()并安装事件过滤器()。这允许插件访问场景点击并处理它需要的任何信息。但是,背景图片由itemAt()调用返回。
我希望在以后的插件中阻止这个背景Pixmap返回itemAt()函数,可以吗?
尝试:

setEnabled(false); //No success
xmd2e60i

xmd2e60i1#

这并不能直接回答您的问题,但应该可以解决您的问题:我建议重新实现QGraphicsScene::drawBackground()并在那里绘制你的像素图,这就是这个方法的作用。
一种类似的方法是将pixmap放在资源文件中,然后使用样式表将其设置为QGraphicsView或其viewport小部件的背景(我认为这两者的效果略有不同)。

dfuffjeb

dfuffjeb2#

要使项目对itemAt()(或任何其他冲突检测方法)不可见,可以使boundingRect()方法返回宽度和高度为零的QRectF。
不过这也有副作用,使QGraphicsView的任何部分视口更新模式失灵,因为QGV不知道项目将在哪里绘制自己。这可以通过让QGV在每次重绘时进行完全更新来补救(setViewportUpdateMode(QGraphicsView::FullViewportUpdate))。根据您的场景,这可能是一个可以接受的折衷方案。如果您使用OpenGL图形后端,视口更新将始终是完全更新。

roejwanj

roejwanj3#

这么多年过去了,答案是这样的:创建自己的QGraphicsItem子类,并覆盖shape()方法

QPainterPath shape() const override
{
    return {};
}

参考文件:https://doc.qt.io/qt-6/qgraphicsitem.html#shape
该形状可用于许多用途,包括碰撞检测、点击测试和QGraphicsScene::items()函数。
因此,这将有效地使项目不可见的itemAt()和其他人。你仍然有boundingRect(),这是用来过滤什么项目应该画。

相关问题