itemChanged() 在 QGraphicsItem 中用于许多不同的项目
itemChanged() in QGraphicsItem for a many different items
我有一个应用程序,其中包含一个QGraphisScene
中的许多不同项目。这些项目将是矩形、椭圆、像素图或从 QGraphicsItem
继承的任何内容。用户可以在这些项目周围移动。(设置了每个QGraphicsItem::ItemIsMovable
标志)。
应用程序需要获取一个事件(回调、信号或其他什么)来获取新仓位。
如何一次性为所有这些可能的项目重载itemChanged()
方法?我想避免对我每个可能的项目进行子类化(即为QGraphicsEllipseItem
做一个派生类,为QGraphicsPixmapItem
做一个派生类,为任何未来的项目做一个子类......
我希望能够告诉: 每次QGraphicsItem
(或从中派生的任何内容)更改时,调用我的函数:
my_item_changed(QGraphicItem* the_change_item,...).
然后能够添加不同的项目类型,而不必担心这一点......
有什么提示吗?
您可以在 QGraphicsItems 上安装事件过滤器。特别是,您需要使用此函数:-
void QGraphicsItem::installSceneEventFilter(QGraphicsItem * filterItem);
正如Qt文档所述,以下是其用法的示例: -
QGraphicsScene scene;
QGraphicsEllipseItem *ellipse = scene.addEllipse(QRectF(-10, -10, 20, 20));
QGraphicsLineItem *line = scene.addLine(QLineF(-10, -10, 20, 20));
line->installSceneEventFilter(ellipse);
// line's events are filtered by ellipse's sceneEventFilter() function.
ellipse->installSceneEventFilter(line);
// ellipse's events are filtered by line's sceneEventFilter() function.
基于此,创建一个派生自 QGraphicsItem 的类,该类可以首先接收事件。对于添加到场景中的每个项目,调用 installSceneEventFilter:-
mySceneEventItem.installSceneEventFilter(pGraphicsItem);
接下来,您的 eventFilter 对象将覆盖该函数:-
bool QGraphicsItem::sceneEventFilter(QGraphicsItem * watched, QEvent * event)
{
if(event->type() == QEvent::GraphicsSceneMove)
{
emit my_item_changed(watched); // signal that the item was moved
}
return false; // pass the event to the original target item
}
这允许您检查事件并处理您感兴趣的事件。如果从 sceneEventFilter 返回 false,则在处理完该事件后,该事件将传递到原始对象上;返回 true 将阻止事件被传递。
相关文章:
- cmake在我的项目中所需的所有静态库都不成功
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在其他文件中创建类时在 c++ 项目中不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 有没有办法使用输入的维度初始化 2d 数组中的所有项目而不循环C++?
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- LD:尝试编译项目时找不到架构x86_64符号
- Eulers 项目问题 no 345 听不懂几行代码
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么许多项目不提供预编译的二进制文件?
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 使用 Premake5 构建项目不会生成可执行文件或中间体
- 正确设计具有许多C++常量的项目
- 当包含头文件的文件不在根项目文件夹中时,如何包含它
- CMake VS_PACKAGE_REFERENCES不添加对 VS2017 项目的引用
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 自定义构建文件更改不会触发VS 2017中的项目重建
- 我如何实现递归函数的模板,该模板允许C 中的许多不确定数据类型的参数
- 我正在使用Xcode进行c ++编程和学习。为什么我不能在一个项目中放置许多具有 MAIN 功能的单独源文件?