在发生拖动时更新QGraphicsItem

时间:2012-09-02 20:55:56

标签: qt drag-and-drop qgraphicsitem

我正在创建一个QGraphicsView派生的窗口小部件,除其他外,它需要在其中的项目之间创建连接 - 有点像控制流图。但是我在实现一种“绘制”连接的方法时遇到了麻烦

我尝试了两种方法:

  1. 在触发源对象QGraphicsLineItem时创建mouseMoveEvent(..)派生对象,并在每次后续移动时更新它。该行被成功绘制和更新,但最终这不起作用,因为似乎将鼠标“锁定”事件循环仅处理鼠标移动事件,因此另一个对象的hoverEnterEvent(..)/ hoverMoveEvent(..)/等等不调用方法(这些是完成连接所必需的。)
  2. 在mouseMoveEvent(..)中创建QDrag实例以创建两个对象之间的连接允许两个对象在删除后形成连接,但最终这不起作用,因为QDrag::exec()调用没有提供其他对象通知鼠标移动的方法 - 因此无法更新绘制的连接。
  3. 我真的需要两者的混合:在一个完美的世界中,QDrag::exec()调用将允许其他某种类型的鼠标移动通知,因此我可以更新代表连接的对象。有人有建议吗?

    与此question类似。

1 个答案:

答案 0 :(得分:1)

我有一个开源小部件来执行此操作,它适用于PyQt,但它可能对您正在寻找的内容有所帮助。

您可以在http://dev.projexsoftware.com/projects/projexui

的projexui框架中找到它

您正在寻找的代码特别是在projexui / widgets / xnodewidget中找到的XNodeWidget类

最终,我使用鼠标按下事件通过场景开始连接并忽略该事件(基于某种触发器 - 控制按键或热点区域等)。

希望有所帮助!

(它的外观示例是Orbiter应用程序上的表格视图 - http://www.projexsoftware.com/software/orbiter