есть очень обычная 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, и это немного помогает:
Так что, наконец, у меня есть работа:
"A"->setLayout(myLayout);
"A"->installEventFilter(myLayout);
if(event->type() == QEvent::Enter) grabKeyboard();
if(event->type() == QEvent::Leave) releaseKeyboard();
Ключом к его работе было мое непонимание Qt-документов относительно "installEventFilter". "Filterobject" - это объект, который хочет получить все события, контролируемый объект - тот, с которым мы хотели бы получить любые события. Затем установка фильтра работает (и думает об этом делает его совершенно логичным): monitoredObject->installEventFilter(filterobject);
,