一般情况下我们想实现一个悬浮窗或者小部件,要求透传鼠标事件,且在大于给定的透明度时又需要拦截鼠标事件,这个悬浮窗当然也要支持透明度设置。
实现代码如下:
FloatWidget::FloatWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::FloatWidget)
{
ui->setupUi(this);
resize(200, 300);
setPacity(0.6);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Window);
}
void FloatWidget::setPacity(float value)
{
if (value <= 0.8) {
setAttribute(Qt::WA_TransparentForMouseEvents, true);
} else {
setAttribute(Qt::WA_TransparentForMouseEvents, false);
}
setWindowOpacity(value);
}
实现上述代码很简单,但是如果不小心使用就会导致有时候鼠标可以透传但是透明度设置不生效。有时候透明度设置可以生效但是鼠标又无法透传。
在ubuntu22.04经过多次实测后,我们需要优化代码为: