我有一个最简单的测试应用程序:
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)
QWheelEvent
的事件过滤器。 - jonspaceharper