Qt 使用设置透明窗口B 和窗口A的从属关系,而非父子关系,源码实现窗口B叠加另一个窗口A
时间: 2023-07-19 08:04:11 浏览: 41
在 Qt 中,可以使用 `setParent()` 函数来设置窗口的父子关系,但是如果需要实现透明窗口B叠加在窗口A上面,可以使用以下步骤:
1. 将窗口A的属性设置为 `Qt::WA_TransparentForMouseEvents`,这样窗口A就不会接收鼠标事件了。
```cpp
windowA->setAttribute(Qt::WA_TransparentForMouseEvents);
```
2. 将窗口B的属性设置为 `Qt::FramelessWindowHint`,这样就可以去掉窗口B的边框。
```cpp
windowB->setWindowFlags(Qt::FramelessWindowHint);
```
3. 将窗口B设置为窗口A的子窗口,并设置窗口B的位置和大小。
```cpp
windowB->setParent(windowA);
windowB->move(0, 0);
windowB->resize(windowA->size());
```
这样就可以实现窗口B叠加在窗口A上面了。需要注意的是,如果窗口B中有控件需要接收鼠标事件,那么需要将这些控件的属性设置为 `Qt::WA_TransparentForMouseEvents`。
相关问题
Qt 使用设置透明窗口B 和窗口A的从属关系,而非父子关系,源码实现
在 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没有父子关系,而是通过设置从属关系实现的。
Qt 使用设置透明窗口B 和窗口A的从属关系,而非父子关系
是的,Qt 支持在设置透明窗口时,使用 `setWindowOpacity()` 函数设置窗口透明度,并且可以使用 `setWindowFlags()` 函数设置窗口属性。其中,`setWindowFlags()` 函数可以用于设置窗口的从属关系,而不是父子关系。
例如,可以使用以下代码将窗口 B 设置为窗口 A 的从属窗口:
```cpp
// 设置窗口 B 的属性
QWidget* windowB = new QWidget;
windowB->setWindowOpacity(0.5);
windowB->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
// 设置窗口 A 为窗口 B 的主窗口
windowB->setParent(windowA, Qt::Dialog);
```
在上面的代码中,`setWindowFlags()` 函数设置了窗口 B 的属性,使其成为一个无边框工具窗口,并且使用 `setParent()` 函数将窗口 B 设置为窗口 A 的从属窗口,同时指定了从属关系为 `Qt::Dialog`。这样,窗口 B 将会在窗口 A 的上层显示,并且随着窗口 A 的移动和调整大小而自动调整位置和大小。