使用 QWindow 进行拖放

Posted

技术标签:

【中文标题】使用 QWindow 进行拖放【英文标题】:Drag-n-drop with QWindow 【发布时间】:2015-05-03 23:29:31 【问题描述】:

我有自定义 QWidget,其中包含自定义 QWindow。带有 OpenGL 的QWindow 用作渲染框架和 Qt 应用程序之间的“连接器”。

鼠标和键盘事件由覆盖 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
;

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

问题:

    QWindow 不提供用于拖放支持的虚拟方法。 QWidget::dragEnterEventQWidget::dropEvent(和类似的)不会被调用。 QWindow 仍然接受鼠标事件,即使 setMouseGrabEnabled( false ); 已设置。

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

【问题讨论】:

【参考方案1】:

我找到了解决办法:

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

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

【讨论】:

以上是关于使用 QWindow 进行拖放的主要内容,如果未能解决你的问题,请参考以下文章

在主窗口中显示 QWindow

从 QGLWidget 迁移到 QWindow

无法让 QWindow::fromWinId 正常工作

为啥 PyQt5 QWindow.setScreen() 不工作?

Qt QWindow转QWidget

如何在 QMdiArea 中显示 QWindow