2

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

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

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

所以这里是我如何看待这件事的总结:

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

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

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

4

1 回答 1

2

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

您可能对 Qt 的“Diagram Scene”示例项目感兴趣,它演示了QGraphicsSceneAPI。这听起来很适合您描述的场景。(该示例的完整源代码随 Qt 一起提供。)

在此处输入图像描述

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

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

于 2012-10-21T09:09:21.960 回答