Qt 使用设置透明窗口B 和窗口A的从属关系,而非父子关系,源码实现
时间: 2023-09-25 11:11:06 浏览: 110
在 Qt 中,可以通过设置窗口属性 `Qt::FramelessWindowHint` 来创建透明窗口。要设置窗口B为窗口A的从属窗口,可以使用如下方法:
1. 在窗口A的构造函数中创建窗口B,并设置窗口B的 `Qt::FramelessWindowHint` 属性和透明度。
```c++
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 创建窗口B
m_subWindow = new QWidget(this, Qt::Window);
m_subWindow->setWindowFlags(Qt::FramelessWindowHint);
m_subWindow->setAttribute(Qt::WA_TranslucentBackground);
// 设置窗口B的大小和位置
m_subWindow->resize(200, 200);
m_subWindow->move(50, 50);
// 设置窗口B的透明度
QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect(m_subWindow);
opacityEffect->setOpacity(0.5);
m_subWindow->setGraphicsEffect(opacityEffect);
}
```
2. 重写窗口A的 `eventFilter()` 函数,并在该函数中实现窗口B的移动和隐藏。
```c++
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == this && event->type() == QEvent::MouseMove) {
// 获取鼠标位置
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QPoint pos = mouseEvent->pos();
// 计算窗口B的新位置
QPoint subPos = pos - m_subWindow->rect().center();
// 移动窗口B
m_subWindow->move(subPos);
// 显示窗口B
m_subWindow->show();
}
else if (obj == this && event->type() == QEvent::Leave) {
// 隐藏窗口B
m_subWindow->hide();
}
return QMainWindow::eventFilter(obj, event);
}
```
3. 在窗口A的构造函数中安装事件过滤器。
```c++
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 安装事件过滤器
installEventFilter(this);
}
```
这样,当鼠标在窗口A上移动时,窗口B会跟随鼠标移动并显示出来;当鼠标离开窗口A时,窗口B会隐藏。同时,窗口B与窗口A没有父子关系,而是通过设置从属关系实现的。
阅读全文