2015-03-03 177 views
3

我有自定義QWidget,其中包含自定義QWindow。使用OpenGL的QWindow被用作渲染框架和Qt應用程序之間的「連接器」。使用QWindow進行拖放

鼠標和鍵盤事件通過重寫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中處理鼠標事件。

回答

2

我找到了一個解決方案:

有必要對QWindow和處理事件有(eventFilter)安裝事件過濾器。

可以在QWidget(容器)上安裝事件過濾器,但它不適用於OS X.可能它是Qt中的錯誤,因爲在Win下一切都很好。