Qt 要求 透明窗口B不是播放窗口A的子对象,但是要正好覆盖住在窗口A,且一直跟随A窗口位置,源码实现
时间: 2023-07-19 12:03:20 浏览: 46
要实现透明窗口B正好覆盖住在窗口A,且一直跟随A窗口位置的效果,我们可以使用以下步骤:
1. 创建透明窗口B,设置透明属性为true,设置窗口背景为透明。
2. 监听窗口A的位置变化事件,当窗口A位置变化时,计算透明窗口B应该出现的位置,并移动透明窗口B。
下面是示例代码:
```cpp
// 创建透明窗口B
QMainWindow *transparentWindow = new QMainWindow();
transparentWindow->setAttribute(Qt::WA_TranslucentBackground, true);
transparentWindow->setStyleSheet("background-color: transparent;");
// 监听窗口A的位置变化事件
QObject::connect(windowA, &QMainWindow::geometryChanged, [=]() {
// 计算透明窗口B应该出现的位置
QRect geometryA = windowA->geometry();
QPoint positionB = QPoint(geometryA.x(), geometryA.y());
// 移动透明窗口B
transparentWindow->move(positionB);
});
```
这样,透明窗口B就能够正好覆盖住在窗口A,并且一直跟随A窗口位置了。
相关问题
Qt 要求 窗口B不是窗口A的子窗口,透明窗口B正好覆盖住在窗口A,且一直跟随A窗口位置,源码实现
实现这个功能的方法是:
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的跟随。
Qt 要求 窗口B不是窗口A的子窗口,透明窗口B一直覆盖在窗口A上方,源码实现
可以使用 `Qt::WindowStaysOnTopHint` 属性来实现窗口B一直覆盖在窗口A上方的效果,同时使用 `Qt::FramelessWindowHint` 属性来去掉窗口B的边框,使其成为透明窗口。
以下是一个简单的示例代码:
```cpp
#include <QtWidgets>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建窗口A
QWidget windowA;
windowA.setGeometry(100, 100, 400, 300);
windowA.show();
// 创建窗口B
QWidget windowB;
windowB.setGeometry(150, 150, 200, 150);
windowB.setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
windowB.setAttribute(Qt::WA_TranslucentBackground); // 设置透明背景
windowB.show();
return app.exec();
}
```
在这个示例中,窗口B通过设置 `Qt::WindowStaysOnTopHint` 属性来保持在窗口A的上方,同时通过设置 `Qt::FramelessWindowHint` 属性来去掉窗口B的边框,使其成为透明窗口。同时,通过 `setAttribute(Qt::WA_TranslucentBackground)` 来设置窗口B的背景为透明。