У меня есть простейшее приложение для тестирования:
TransWidget.cpp:
TransWidget::TransWidget(QWidget *parent) :
QWidget(parent, Qt::Window | Qt::FramelessWindowHint)
{
setAttribute(Qt::WA_ShowWithoutActivating);
setAttribute(Qt::WA_TransparentForMouseEvents);
setAttribute(Qt::WA_TranslucentBackground);
}
void TransWidget::paintEvent(QPaintEvent *)
{
// some code to mark the presence of the window
}
void TransWidget::wheelEvent(QWheelEvent * ev)
{
ev->ignore(); // keeps getting here no matter what I try!
}
main.cpp:
#include "TransWidget.h"#include "OpaqueWidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
OpaqueWidget o;
auto t = new TransWidget(&o);
o.show();
t->show();
return a.exec();
}
Непрозрачный виджет просто сообщает, когда он получает щелчки мыши и события колеса. Прозрачный виджет перекрывает непрозрачный виджет.
Щелчки мыши работают как положено:
События колеса попадают в прозрачный виджет независимо от того, где они происходят.
Такая же настройка используется для работы с Qt4.8. Это ошибка в Qt5? Возможны ли обходные пути?
Решение подобного вопроса, кажется, не работает также:
Как создать полупрозрачное окно в WPF, которое позволяет проходить событиям мыши
(Qt 5.6.1, Windows 10)
Принято как ошибка Qt, смотрите https://bugreports.qt.io/browse/QTBUG-53418 для деталей.
Других решений пока нет …