我正在使用C ++ / Qt构建一个编辑器,它有一个点击拖动的感觉。行为类似于原理图编辑器(Eagle,KiCAD等),Microsoft Visio或将对象从工具栏拖动到中央编辑区域的其他程序。
我的问题是当用户点击自定义小部件时,我希望能够选择类似盒子的对象的实例并对其进行操作。还有将线框连接在一起的线。但是,我无法决定选择这些对象的有效方法。
我有两个关于如何为此进行编程的主要想法:第一个是绘制整个编辑器的小部件将简单地封装盒子的每个实例。另一个是让盒子的每个实例(在我的模型中)携带一个QWidget的实例,它将处理渲染盒子(这将在我的视图中...但它最终将强烈附加到该模型)。至于连接它们的线,因为它们没有方形边框,所以它们必须由包含的小部件呈现。
以下是我如何看待这一点的摘要:
所以,现在有一些背景,对于第二种方法,我计划让每个类似盒子的实例都有一个边界矩形,这些线由3-4个像素宽的边界矩形段表示(它们是90度数角度)。我可以遍历每一个框和行,但这似乎效率很低。
最大的问题:是否存在某种数据结构我可以保持矩形并将它们链接到小部件(或其他任何内容),然后给它两个坐标(例如鼠标坐标)并让它吐出来这些坐标位于?
内的边界框或链接对象答案 0 :(得分:2)
听起来你真正的问题是找到一种实现编辑器的好方法,而不是矩形交叉性能的具体细节。
您可能对Qt "Diagram Scene" example project感兴趣,它展示了QGraphicsScene
API。这听起来非常适合您描述的场景。 (该示例的完整源代码附带Qt。)
最好的部分是你仍然不必自己实施命中测试,因为API已经提供了你想要的东西(例如,QGraphicsScene::itemAt()
)。
值得注意的是,在内部,QGraphicsScene
使用简单的迭代方法来执行命中测试。正如其他人所指出的那样,除非你的场景中有个别项目很多,否则这不会是一个严重的瓶颈。