Как передать события X11 в QDialog - PullRequest
3 голосов
/ 28 января 2012

В настоящее время я пытаюсь передать системные события X11 (в Linux) объекту, который я создал. Для этого я установил eventFilter на свой объект из моего приложения QApplication. Это работает, так как получает все события приложения. Однако мне нужно также передать события объекта X11.

Я создал x11Event в своем объекте, надеясь, что он получит события от X11, но это не так.

Есть ли способ передать события X11 непосредственно моему объекту внутри моего приложения?

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Вы можете получить XEvent s через:

  • функция фильтра, установленная с QAbstractEventDispatcher::instance()->setEventFilter(), которая будет получать все XEvent с.
  • функция фильтра, установленная с qApp->setEventFilter(), которая будет получать только события, нацеленные на приложение.
  • переопределение виртуальной функции QApplication::x11EventFilter
  • переопределение виртуальной функции QWidget::x11Event для ваших окон верхнего уровня (дочерние виджеты не получают XEvent с).

в таком порядке. Если какая-либо из этих функций возвращает true для какого-либо события, следующая функция не получит это событие.

Некоторые события также могут быть отфильтрованы с помощью Qt между этими функциями, например, QWidget::x11Event не получает XKeyEvent s (которые фильтруются функцией QInputContext::x11FilterEvent виджета с фокусом клавиатуры).

Для более подробной информации, вы должны посмотреть на источники Qt: QEventDispatcher_x11.cpp и функцию QApplication::x11ProcessEvent в QApplication_x11.cpp

Таким образом, по большей части, если вы переопределите только функцию x11Event в своем производном классе QDialog, вы уже должны получить большинство XEvent. И если вы хотите, чтобы ваши дочерние виджеты тоже получали их, вы можете вручную вызывать их x11Event функции после переопределения QDialog::x11Event.

.
1 голос
/ 28 января 2012

У меня сейчас нет моей машины разработчика, так что прости мой синтаксис.Я бы сделал следующее:

  1. Объявить XEvent * в качестве метатипа:

    int main() { qRegisterMetatype<XEvent*>(); }

  2. Повторная реализация QApplication::x11EventFilterкак предположил alexisdm

  3. Создайте сигнал в вашей повторной реализации QApplication, например:

    void dialogEvent(XEvent*);

  4. Чем из любой точкиВ вашем приложении вы можете сделать следующее:

    QApplication *inst = QApllication::instance();

    MyApplication *myApp = qobject_cast<MyApplication*>(inst);

    if (myApp! = 0) {

    connect(myApp, SIGNAL(dialogEvent(XEvent*), 
             myDialog, SLOT(onXEvent(XEvent*));
    

    }

Таким образом, вы можете получить доступ к событию x11 по всему миру.В качестве альтернативы вы всегда можете переопределить:

bool QWidget::x11Event ( XEvent * event )

для отдельных виджетов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...