2015-03-03 3 views
3

У меня есть таможня QWidget, которая содержит пользовательские QWindow. QWindow с OpenGL используется как «соединитель» между средой рендеринга и приложением Qt.Drag-n-drop с 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::dragEnterEvent, QWidget::dropEvent (и тому подобное) не называются.
  3. QWindow все еще принимает события мыши, даже setMouseGrabEnabled(false); установлен.

Примечание: Я нашел, что звонок setMouseGrabEnabled(false); не блокирует обработку событий мыши в QWindow.

ответ

2

Я нашел решение:

Необходимо установить фильтр событий на QWindow и событий процесса там (eventFilter).

Возможно установить фильтр событий на QWidget (контейнер), но он не работает на OS X. Вероятно, это ошибка в Qt, потому что под Win все в порядке.

Смежные вопросы