我的自定义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
};
问题:如何处理掉落事件(在哪里不重要)?
问题:
QWindow
没有为拖放支持提供虚拟方法。QWidget::dragEnterEvent
,QWidget::dropEvent
(和类似的)未被调用。QWindow
仍然接受鼠标事件,甚至设置了setMouseGrabEnabled( false );
。注意:我发现调用setMouseGrabEnabled( false );
并不会阻止QWindow
中的鼠标事件处理。
答案 0 :(得分:3)
我找到了解决方案:
有必要在QWindow
上安装事件过滤器并在那里处理事件(eventFilter
)。
可以在QWidget
(容器)上安装事件过滤器,但它在OS X上不起作用。可能这是Qt中的一个错误,因为在Win下一切都很好。