如何在 QGraphicsScene 上进行选择?

Posted

技术标签:

【中文标题】如何在 QGraphicsScene 上进行选择?【英文标题】:How to make selection on QGraphicsScene? 【发布时间】:2011-02-21 16:12:20 【问题描述】:

我正在使用图形视图框架在 Qt 中编写图表编辑器。 目前我只是想在 GraphScene (QGraphicsScene) 上创建一个简单的节点 (QGraphicsItem)。我创建了一个 Canvas (QGraphicsView) 并向其中添加了一个网格。我什至可以添加节点并在场景中移动它们。我的最终目标是拥有不同的工作模式、编辑和样式选项等。现在我只想知道如何为场景中已经存在的节点设置选择。我尝试用鼠标事件来做,但注意到事件调用选择和节点插入重叠......当我尝试选择一些东西时,创建了一个新节点......这是我的第一个 Qt 应用程序,所以我不完全理解应该设计我想要实现的功能。

如何正确绘制选择矩形? 我应该如何管理相互冲突的鼠标事件?

【问题讨论】:

【参考方案1】: 您可以使用可检查按钮/操作(即 QPushButton/QAction 的可检查属性设置为“true”)在编辑和插入模式之间切换。然后检查鼠标事件中的状态并仅在处于插入模式时插入新项目。 您还可以区分鼠标按钮 - 例如,在使用右键拖动时插入项目 或使用 QKeyboardModifiers - 例如:拖动 + Ctrl - 插入项目。

希望这会有所帮助。

【讨论】:

【参考方案2】:

在鼠标事件重叠的情况下,你应该有一个地方(比如 QGraphicsView 来处理鼠标点击/移动事件)并创建一个状态机,然后根据你所处的状态来处理事件。你需要很好地规划您的架构,这可能是一项非常复杂的任务。

设置您的状态枚举/常量 在您的 if 条件中引用您的事件中的当前机器状态 将您的“业务逻辑”放在一个地方

就像这两个 NodeEditor 教程 #11 和 #12 中所示:https://www.youtube.com/watch?v=pk4v2xuXlm4 和 https://www.youtube.com/watch?v=-VYcQojkloE)

如果您仍想更深入地解释 Qt 的功能和事件,这里有一个完整的教程列表,其中包含实现所有可能的功能,例如将边缘拖动到节点、选择它们并删除它们、切割边缘、序列化等。 ,你可以看看我在这里记录的 50 个教程的完整列表:https://www.blenderfreak.com/tutorials/node-editor-tutorial-series/。

我将链接到整个列表,因为不可能在此页面上编写所有代码...

【讨论】:

以上是关于如何在 QGraphicsScene 上进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何在获得完全外部联接的同一列上进行选择?

angularjs 如何在日期上进行验证。当我使用日期选择器时

MySQL如何使用Not Exist在多个表上进行选择

当在另一个下拉列表上进行选择时,如何在 Django 的管理员中过滤下拉列表

Laravel Eloquent 在 whereHas() 上进行选择

如何阻止鼠标中键单击取消选择 QGraphicsScene 中的项目而不阻止它与场景中的项目相结合?