使用 QWindow 拖放
Drag-n-drop with QWindow
我有包含自定义 QWindow
的自定义 QWidget
。 QWindow
与 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
};
问题:如何处理掉落事件(在哪里都无所谓)?
问题:
QWindow
不提供拖放支持的虚拟方法。
QWidget::dragEnterEvent
、QWidget::dropEvent
(以及类似的)不被调用。
QWindow
仍然接受鼠标事件,即使设置了 setMouseGrabEnabled( false );
。
注意:我发现 setMouseGrabEnabled( false );
的调用不会阻止 QWindow
中的鼠标事件处理。
我找到了解决方案:
有必要在 QWindow
上安装事件过滤器并在那里处理事件 (eventFilter
)。
可以在 QWidget
(容器)上安装事件过滤器,但在 OS X 上不起作用。可能是 Qt 中的一个错误,因为在 Win 下一切正常。
我有包含自定义 QWindow
的自定义 QWidget
。 QWindow
与 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
};
问题:如何处理掉落事件(在哪里都无所谓)?
问题:
QWindow
不提供拖放支持的虚拟方法。QWidget::dragEnterEvent
、QWidget::dropEvent
(以及类似的)不被调用。QWindow
仍然接受鼠标事件,即使设置了setMouseGrabEnabled( false );
。
注意:我发现 setMouseGrabEnabled( false );
的调用不会阻止 QWindow
中的鼠标事件处理。
我找到了解决方案:
有必要在 QWindow
上安装事件过滤器并在那里处理事件 (eventFilter
)。
可以在 QWidget
(容器)上安装事件过滤器,但在 OS X 上不起作用。可能是 Qt 中的一个错误,因为在 Win 下一切正常。