【发布时间】:2016-05-13 10:00:49
【问题描述】:
我有一个最简单的测试用例应用程序:
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中的错误吗?任何可能的解决方法?
类似问题的解决方案似乎也不起作用: How to create a semi transparent window in WPF that allows mouse events to pass through
(Qt 5.6.1,Windows 10)
【问题讨论】:
-
Windows 10 发生了很大变化。您是否尝试过转动设置 -> 设备 -> 鼠标和触摸板:当我将鼠标悬停在非活动窗口上时滚动它们离开?不是您的问题的答案,而是缩小导致此问题的原因。
-
@IInspectable 哇,不知道这个设置)但是切换它不会改变行为......
-
您是否检查过它没有为其焦点策略设置
Qt::WheelFocus标志?这不太可能,但这是我唯一能想到的。 -
顺便说一句,作为一种解决方法,为
QWheelEvent安装一个事件过滤器。 -
@JonHarper 现在检查,它是 Qt::NoFocus。叹息……
标签: c++ qt winapi transparent mousewheel