Qt中实现拖拽控件到窗口外-处理事件被截断问题
程序员文章站
2022-04-27 20:24:00
...
上一篇文章讲解了如何将一个控件拖拽到窗口外,并将窗口外的控件拖回到原来的窗口。在开始拖拽的时候,由于控件被移动到另一个窗口,所以导致后续的鼠标事件不能被接收。这篇文章将给出一个解决方法。
- 需要通过全局的方式接收鼠标拖拽事件。
- 拖拽开始判断的逻辑继续在MouseArea中处理,当开始拖拽的时候通知全局事件接收器处理拖拽。
- Qml中监听全局事件接收器的鼠标移动通知,根据移动位置控制控件显示位置。
- 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;
}