Qt - виджет верхнего уровня с прозрачностью событий клавиатуры и мыши? - PullRequest
40 голосов
/ 12 июня 2009

Я хочу, чтобы главное окно приложения игнорировало события мыши и клавиатуры, передавая их приложениям под ним в Z-порядке оконного менеджера.

Я вижу, как заставить дочерние виджеты игнорировать события клавиатуры или мыши, но как насчет главного окна?

Я пытаюсь создать настольный виджет, который всегда находится на заднем плане и абсолютно невидим для событий клавиатуры и мыши. (Пройти через)

Qt :: X11BypassWindowManagerHint позволяет мне проходить через клавиатуру (хотя, к сожалению, специфично для X11, но пока хорошо), так как насчет событий мыши?

Существует ли независимый от ОС способ быть прозрачным для событий клавиатуры?

EDIT:

Ключевое слово здесь - прозрачность.

Я не хочу ЕСТЬ события мыши и клавиатуры, я хочу, чтобы оконный менеджер знал, что я их вообще не хочу. Эти события должны быть направлены на все приложения, которые находятся под мной в Зордер.

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

Ответы [ 6 ]

11 голосов
/ 08 февраля 2011

В Windows вы можете установить WS_EX_TRANSPARENT

Для этого в Qt используйте следующий код:

Включите заголовок,

#if _WIN32
    #include <windows.h>
#endif

и поместите следующий код в конструктор.

#if _WIN32
    HWND hwnd = (HWND) winId();
    LONG styles = GetWindowLong(hwnd, GWL_EXSTYLE);
    SetWindowLong(hwnd, GWL_EXSTYLE, styles | WS_EX_TRANSPARENT);
#endif
10 голосов
/ 03 августа 2016

Я нашел следующее решение (протестировано в Linux, также работает в Windows согласно @TheSHEEEP):

setWindowFlags(windowFlags() | Qt::WindowTransparentForInput);

Он был добавлен в более позднюю версию qt (я не нашел когда) см http://doc.qt.io/qt-5/qt.html

8 голосов
/ 10 июля 2009

Может быть, вы хотите

widget->setAttribute(Qt::WA_TransparentForMouseEvents)

? Это то, что QRubberBand использует, чтобы позволить своему родителю обрабатывать события мыши. Что касается событий клавиатуры, QWidget не получает никаких событий клавиатуры, если он не установил себя focusPolicy ().

setFocusPolicy( Qt::NoFocus );

поэтому должен позаботиться о событиях клавиатуры.

2 голосов
/ 19 июня 2009

Может быть, я чего-то здесь упускаю, но вы пытались создать подкласс класса QMainWindow и переопределить метод QWidget :: event () , чтобы всегда возвращать false? Если вам нужно обработать некоторые события, вы можете добавить сюда и этот интеллект.

Этот метод должен позволять вам просматривать события, поступающие в приложение, и игнорировать их, если необходимо, без необходимости использовать их с использованием фильтра событий.

Если это не работает, вы можете попытаться перенаправить события на рабочий стол, вызвав QCoreApplication :: notify () и передав событие в виджет рабочего стола, полученный с помощью вызова QApplication :: настольные () * * +1010. Я понятия не имею, сработает ли это, но, похоже, стоит попробовать.

1 голос
/ 18 июня 2009

Используйте фильтры событий Qt : они позволят вашему приложению есть те события, которые вы укажете (например, события клавиатуры и мыши), но все равно обрабатывать другие события, такие как события рисования.

bool FilterObject::eventFilter(QObject* object, QEvent* event)
{
    QKeyEvent* pKeyEvent = qobject_cast<QKeyEvent*>(event);
    QMouseEvent* pMouseEvent = qobject_cast<QMouseEvent*>(event);

    if (pKeyEvent || pMouseEvent)
    {
        // eat all keyboard and mouse events
        return true;
    }

    return FilterObjectParent::eventFilter(object, event);
}
1 голос
/ 16 июня 2009

Я думаю, что переопределение должно работать:

bool YourMainWindow::event( QEvent *event )
{
   event ->accept();
   return true;
}

Вот что говорит документация класса QWidget о функции-члене event ():

Эта функция возвращает true, если событие было признано, иначе оно возвращает ложь Если распознано событие был принят (см. QEvent :: accept), любая дальнейшая обработка, такая как событие распространение на родительский виджет останавливается.

...