c++ - 基于坐标查找 map 中物体的高效方法

标签 c++ qt data-structures geometry mouseevent

我正在使用 C++/Qt 构建一个编辑器,它具有点击和拖动的感觉。其行为类似于原理图编辑器(Eagle、KiCAD 等)、Microsoft Visio 或其他程序,您可以在其中将对象从工具栏拖动到中央编辑区域。

我的问题是,当用户在自定义小部件内单击时,我希望能够选择盒状对象的实例并对其进行操作。还将有线将盒子连接在一起。但是,我无法决定选择这些对象的有效方法。

关于如何为此进行编程,我有两个主要想法:第一个是绘制整个编辑器的小部件将简单地封装框的每个实例。另一种方法是让盒子的每个实例(在我的模型中)都带有一个 QWidget 实例,该实例将处理渲染盒子(在我的 View 中......但它最终会被牢固地附加到该模型)。至于连接它们的线,由于它们没有方形边界框,因此必须由包含的小部件渲染。

以下是我对如何完成此操作的总结:

  • 编辑器小部件变成一个容纳小部件的容器,并且小部件处理自己的单击事件。这里的潜在问题是我不知道如何使自定义小部件变成允许单击和拖动功能的布局。
  • 编辑器小部件负责所有渲染并处理鼠标单击(更简单的方法,我不必担心布局......它只是有效地选择实例,我不知道会是什么最好)。

所以,现在有了一些背景知识,对于第二种方法,我计划让每个类似盒子的实例都有一个边界矩形,并且线条由 3-4 像素宽的边界矩形段表示(它们位于 90度角)。我可以遍历每个框和行,但这似乎效率很低。

最大的问题:是否有某种数据结构可以容纳矩形并将它们链接到小部件(或任何其他与此相关的东西),然后给它两个坐标(例如鼠标坐标)并让它把我吐出来这些坐标所在的边界框或链接对象?

最佳答案

听起来您真正的问题是找到一种实现编辑器的好方法,而不是矩形相交性能的细节。

您可能对 Qt 的 "Diagram Scene" example project 感兴趣,它演示了 QGraphicsScene API。听起来很适合您描述的场景。 (该示例的完整源代码随 Qt 一起提供。)

enter image description here

最好的部分是,您仍然不必自己实现 HitTest ,因为 API 已经提供了您正在寻找的内容(例如 QGraphicsScene::itemAt() )。

值得注意的是,在内部,QGraphicsScene使用简单的迭代方法来执行 HitTest 。正如其他人指出的那样,除非您的场景有很多单独的项目,否则这不会成为严重的瓶颈。

关于c++ - 基于坐标查找 map 中物体的高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984935/

相关文章:

c++ - 从模板创建用于在 Qt 中打印的 PDF 文档

python - 字典和哈希表之间的真正区别是什么?

c++ - 为什么我不能将 LDBL_EPSILON 添加到 1

c++ - boost::lexical_cast 可以将字符串中的十六进制转换为整数吗?

c++ - 某些代码未从代码覆盖率中删除

c++ - 如何获得更精确的鼠标移动

algorithm - 使用分而治之算法的力量

python - 在没有循环的情况下删除 O(1) 中双嵌套字典中的键及其值?

c# - 检查数字是否是完全平方数(数字超过 15 位)

c++ - c++中删除变量的详细信息