基于坐标在地图中查找对象的有效方法

时间:2012-10-20 03:16:04

标签: c++ qt data-structures geometry mouseevent

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

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

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

以下是我如何看待这一点的摘要:

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

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

最大的问题:是否存在某种数据结构我可以保持矩形并将它们链接到小部件(或其他任何内容),然后给它两个坐标(例如鼠标坐标)并让它吐出来这些坐标位于?

内的边界框或链接对象

1 个答案:

答案 0 :(得分:2)

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

您可能对Qt "Diagram Scene" example project感兴趣,它展示了QGraphicsScene API。这听起来非常适合您描述的场景。 (该示例的完整源代码附带Qt。)

enter image description here

最好的部分是你仍然不必自己实施命中测试,因为API已经提供了你想要的东西(例如,QGraphicsScene::itemAt())。

值得注意的是,在内部,QGraphicsScene使用简单的迭代方法来执行命中测试。正如其他人所指出的那样,除非你的场景中有个别项目很多,否则这不会是一个严重的瓶颈。