欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt中实现拖拽控件到窗口外-处理事件被截断问题

程序员文章站 2022-04-27 20:24:00
...

上一篇文章讲解了如何将一个控件拖拽到窗口外,并将窗口外的控件拖回到原来的窗口。在开始拖拽的时候,由于控件被移动到另一个窗口,所以导致后续的鼠标事件不能被接收。这篇文章将给出一个解决方法。

  1. 需要通过全局的方式接收鼠标拖拽事件。
  2. 拖拽开始判断的逻辑继续在MouseArea中处理,当开始拖拽的时候通知全局事件接收器处理拖拽。
  3. Qml中监听全局事件接收器的鼠标移动通知,根据移动位置控制控件显示位置。
  4. Qml中监听全局事件接收器的鼠标结束通知,根据结束位置判断释放停靠在新的位置。

创建全局事件接收器

定义类**DockDragController ,DockDragController 是QObject的子类。这里我们重写了eventFilter方法用于接收鼠标事件。**

class DockDragController : public QObject
{
    Q_OBJECT
    Q_PROPERTY( bool isDragging READ __getIsDragging WRITE __setIsDragging NOTIFY isDraggingChange )
public:
    explicit DockDragController( QObject *parent = nullptr );
    virtual ~DockDragController();
protected:
    bool eventFilter( QObject *obj, QEvent *event ) override;
}