Нет никакого тривиального способа опубликовать события "глобально", как сказал Дэн. Вся отправка событий собственных событий выполняется с помощью закрытого кода реализации Qt.
Важное различие:
Существуют собственные сообщения / события, доставляемые операционной системой, обычно получаемые циклом событий для конкретного окна.
Есть QEvents.
Внутренне, Qt отслеживает виджеты верхнего уровня (в действительности, windows), поэтому, когда он получает событие от ОС, он знает, в какое окно он должен перейти - он может сопоставить его, используя идентификатор окна платформы, для пример.
QEvent
доставка не имеет смысла без принимающего объекта, поскольку отправка события объекту на самом деле означает только то, что метод QObject::event(QEvent*)
вызывается для этого объекта. Невозможно вызвать этот метод без экземпляра объекта!
Если вы хотите синтезировать глобальное нажатие клавиши или событие щелчка мышью, то вам нужно выяснить, к какому объекту относится это событие. А именно:
Укажите, в какое окно верхнего уровня (виджет) должно перейти событие. Вы можете перечислить виджеты верхнего уровня через qApp->topLevelWidgets()
.
Определите дочерний виджет, к которому должно перейти событие. Если это событие клавиатуры, то достаточно отправить событие в текущий виджет с помощью qApp->focusWidget()
. Вам нужно перечислить дочерние виджеты, чтобы найти самый глубокий в дереве, который перекрывает координаты мыши.
Отправьте правильный подкласс QEvent
на виджет, который вы только что определили. События, доставленные виджетам верхнего уровня, будут перенаправлены на правильный дочерний виджет.
При отправке событий мыши вам также необходимо синтезировать соответствующие события входа и выхода, иначе вы рискуете оставить виджеты в недопустимом состоянии. Исходный файл application.cpp
должен дать вам некоторые идеи.
Это не дает вам доступа к собственным графическим элементам, таким как меню в OS X.
Пожалуйста, сообщите нам точно , что вы пытаетесь сделать. Почему вы хотите опубликовать трансляцию? Кто это получает? Поскольку ваши собственные классы, производные от QObject, будут получать эти широковещательные сообщения, я полагаю, достаточно просто использовать механизм сигнальных слотов. Вы просто connect(...)
получили бы эти классы приемника для сигнала (-ов) какого-то глобального вещателя QObject.