Qt 如何实现 没有父窗口的透明窗口D,永远保持在窗口C之前,且当其他窗口遮挡C时,隐藏半透明窗口D
时间: 2023-07-19 16:03:52 浏览: 119
Qt实现遮罩窗口。。。。
在 Qt 中,可以使用 `setWindowFlags()` 函数来设置窗口的属性。对于透明窗口,需要设置 `Qt::FramelessWindowHint` 和 `Qt::WindowTransparentForInput` 属性。
在窗口D中,可以使用 `Qt::WindowStaysOnTopHint` 属性来保持窗口始终在最上面。同时,可以使用 `setOpacity()` 函数来设置窗口的透明度。
在窗口C中,可以使用 `eventFilter()` 函数来监听其他窗口的事件。当其他窗口遮挡C时,可以通过判断事件类型来隐藏窗口D。具体实现可以参考以下示例代码:
```cpp
// 创建窗口D
QWidget *w = new QWidget();
w->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowTransparentForInput | Qt::WindowStaysOnTopHint);
w->setAttribute(Qt::WA_TranslucentBackground);
w->setOpacity(0.5);
w->show();
// 监听窗口C的事件
QApplication::instance()->installEventFilter(this);
bool MyWidget::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::WindowActivate) {
// 其他窗口激活,隐藏窗口D
w->hide();
} else if (event->type() == QEvent::WindowDeactivate) {
// 其他窗口失去激活,显示窗口D
w->show();
}
return QWidget::eventFilter(obj, event);
}
```
注意,为了使 `eventFilter()` 函数能够监听窗口C的事件,需要在窗口C中调用 `installEventFilter()` 函数并传入窗口C本身。
阅读全文