Qt 要求 窗口B不是窗口A的子窗口,透明窗口B正好覆盖住在窗口A,且一直跟随A窗口位置,源码实现
时间: 2023-07-19 13:03:19 浏览: 41
实现这个功能的方法是:
1. 创建窗口B,并设置窗口B的透明度为0,即不可见。
2. 在窗口A的构造函数中,将窗口B的大小和位置设置为与窗口A相同,并将窗口B放到窗口A的上面,这样窗口B就会覆盖住窗口A,但是由于透明度为0,所以看不见。
3. 在窗口A的resizeEvent()和moveEvent()事件中,将窗口B的大小和位置设置为与窗口A相同,并将窗口B移动到窗口A的上面,这样就可以实现窗口B跟随窗口A的位置和大小变化。
下面是实现的示例代码:
```cpp
#include <QtWidgets>
class MainWindow : public QWidget
{
public:
MainWindow(QWidget *parent = nullptr) : QWidget(parent)
{
// 创建窗口B
m_overlayWindow = new QWidget(this);
m_overlayWindow->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
m_overlayWindow->setAttribute(Qt::WA_TranslucentBackground);
m_overlayWindow->setFixedSize(size());
m_overlayWindow->move(pos());
m_overlayWindow->show();
}
protected:
void resizeEvent(QResizeEvent *event) override
{
QWidget::resizeEvent(event);
// 调整窗口B的大小
m_overlayWindow->setFixedSize(size());
}
void moveEvent(QMoveEvent *event) override
{
QWidget::moveEvent(event);
// 调整窗口B的位置
m_overlayWindow->move(pos());
}
private:
QWidget *m_overlayWindow;
};
```
在上面的代码中,我们使用QWidget来创建窗口A和窗口B,并将窗口B的窗口标志设置为Qt::Tool,这样窗口B就不会成为窗口A的子窗口。同时,我们将窗口B的透明度设置为0,这样就实现了窗口B的不可见。在窗口A的resizeEvent()和moveEvent()事件中,我们调用了窗口B的setFixedSize()和move()函数,以实现窗口B的跟随。