QLayout получает все события другого QWidget

0

есть очень обычная QWidget "А", для которой у меня нет кода, я могу получить его указатель QWidget *. И я должен получать все события "А" и обрабатывать их, прежде чем "А" получит какой-либо (какой-то фильтр событий).

Теперь я уже попытался добавить еще один очень простой QWidget "B" поверх него, но я не могу получить этот "B" полностью прозрачным (мне нужно держать "A" все видимым).

Следующая идея состояла в том, чтобы поставить QLayout "C" поверх "A", но этот макет не получает достаточного количества событий (на самом деле: я поставил оператор qDebug() в "C" :: event (QEvent * evt), который никогда не исполнялся вообще, поэтому макет не принимает никаких событий, что когда-либо).

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

PS: "A" рисует OpenGL, но не выводит QGLWidget. Любые виджеты, которые я поставил поверх всего, покрывали все "А", установка атрибутов типа "WA_PointOnScreen" или "WA_TranslucentBackground" не дала никаких полезных результатов.

PPS: Идея использования QLayout (например, QGridLayout) хороша, потому что мне нужно наложить несколько небольших виджета поверх "А", что также может означать "А" (но они могут быть скрыты по мере необходимости).

EDIT: Я просто попробовал "C"->installEventFilter("A") и реализовал bool "C"::eventFilter(QObject* QEvent*) - безрезультатно - eventFilter никогда не исполнялся...

EDIT: Я просто не хотел сдаваться, я снова попробовал QWidget-подход. Я нашел WidgetAttribute WA_DontShowOnScreen, и это немного помогает:

  • Я получаю все виды событий мыши
  • Я получаю большинство оконных событий системы (краска и изменение размера есть, по крайней мере)
  • Мне не хватает каких-либо событий на клавиатуре - не удивительно, поскольку невидимые виджеты обычно не имеют ничего общего с клавиатурой...
  • Мне не хватает событий ввода/выхода - тоже не удивительно, но почему я получаю события мыши?
Теги:
qt4

1 ответ

0
Лучший ответ

Так что, наконец, у меня есть работа:

  • подкласс QLayout для ваших нужд
  • узнайте, есть ли у вашего QWidget "A" любой подключенный QLayout
    • если да: ваш QLayout должен быть одного и того же типа, поэтому вы можете подключить к нему детей "A"
    • если нет: отлично, просто прикрепите свой собственный макет "A"->setLayout(myLayout);
  • для подкласса myLayout нужны некоторые вещи, чтобы сделать трюк:
    • переопределить функцию eventFilter()
    • "A"->installEventFilter(myLayout);
    • в eventFilter:
    • if(event->type() == QEvent::Enter) grabKeyboard();
    • if(event->type() == QEvent::Leave) releaseKeyboard();
    • ... все, что управление событиями вы хотели бы реализовать...

Ключом к его работе было мое непонимание Qt-документов относительно "installEventFilter". "Filterobject" - это объект, который хочет получить все события, контролируемый объект - тот, с которым мы хотели бы получить любые события. Затем установка фильтра работает (и думает об этом делает его совершенно логичным): monitoredObject->installEventFilter(filterobject); ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню