使用 QWindow 拖放

Drag-n-drop with QWindow

我有包含自定义 QWindow 的自定义 QWidgetQWindow 与 OpenGL 用作渲染框架和 Qt 应用程序之间的 "connector"。

鼠标和键盘事件是通过重写 QWindow 方法处理的。

伪代码:

class MyWindow : public QWindow
{
public:
  MyWindow : QWindow() { /* GL stuff init*/ }
protected:
  // mouse/keyboard event handling
  // expose event handling
  // resize event handling
  // ...
};

class MyWidget : public QWidget
{
public:
  MyWidget : QWidget()
  {
    auto window = new MyWindow();
    auto container = createWindowContainer(window);
    layout()->addWidget( container );
    setAcceptDrops( true );
  }

protected:
  // overriding drop event, but is doesn't work
};

问题:如何处理掉落事件(在哪里都无所谓)?

问题:

  1. QWindow 不提供拖放支持的虚拟方法。
  2. QWidget::dragEnterEventQWidget::dropEvent(以及类似的)不被调用。
  3. QWindow 仍然接受鼠标事件,即使设置了 setMouseGrabEnabled( false );

注意:我发现 setMouseGrabEnabled( false ); 的调用不会阻止 QWindow 中的鼠标事件处理。

我找到了解决方案:

有必要在 QWindow 上安装事件过滤器并在那里处理事件 (eventFilter)。

可以在 QWidget(容器)上安装事件过滤器,但在 OS X 上不起作用。可能是 Qt 中的一个错误,因为在 Win 下一切正常。