使用 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::dragEnterEvent
、QWidget::dropEvent
(和类似的)不会被调用。
QWindow
仍然接受鼠标事件,即使 setMouseGrabEnabled( false );
已设置。
注意:我发现setMouseGrabEnabled( false );
的调用不会阻止QWindow
中的鼠标事件处理。
【问题讨论】:
【参考方案1】:我找到了解决办法:
需要在QWindow
上安装事件过滤器并在那里处理事件(eventFilter
)。
可以在QWidget
(容器)上安装事件过滤器,但它在 OS X 上不起作用。可能这是 Qt 中的一个错误,因为在 Win 下一切正常。
【讨论】:
以上是关于使用 QWindow 进行拖放的主要内容,如果未能解决你的问题,请参考以下文章