Qt 使用设置透明窗口B 和窗口A的从属关系
时间: 2023-08-07 10:07:31 浏览: 142
要使窗口B设置为透明,可以使用`setWindowOpacity()`函数。例如,以下代码将窗口B设置为50%的不透明度:
```
windowB->setWindowOpacity(0.5);
```
要设置窗口A作为窗口B的父窗口,可以使用`setParent()`函数。例如,以下代码将窗口A设置为窗口B的父窗口:
```
windowB->setParent(windowA);
```
这将使窗口B成为窗口A的子窗口,并且当窗口A移动或调整大小时,窗口B也会相应地移动或调整大小。请注意,您可能还需要使用`setAttribute(Qt::WA_TranslucentBackground)`函数来设置窗口B的背景为透明。
相关问题
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 的移动和调整大小而自动调整位置和大小。
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没有父子关系,而是通过设置从属关系实现的。
阅读全文