C++/QT窗口置顶与透明问题

问题遇到的现象和发生背景

C++/QT下,窗口置顶导致透明背景无法设置

遇到的现象和发生背景,请写出第一个错误信息

此窗口的底窗口为设置透明窗口,叠加显示主layout,正常启动显示正常,包括无边框、透明背景和阴影。现加入一个窗口置顶按钮,用户通过点击此按钮实现锁定窗口置顶和解锁窗口置顶。现代码如下,当用户点击时窗口正常置顶或取消置顶,但背景变黑,即使再加入背景透明设置代码也无济于事,求解!
如图为正常运行:

img

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
void CodeBook::on_setTopHint() {
    if (!isWidTop) {
        QWindow* pWin = this->windowHandle();
        pWin->setFlags(Qt::Widget | Qt::WindowStaysOnTopHint);
        this->setAttribute(Qt::WA_TranslucentBackground, true);
        cbWid->setBtnLockState(true);
        qDebug() << u8"CodeBook001: 切换窗口为最顶层";
    }else {
        QWindow* pWin = this->windowHandle();
        pWin->setFlags(Qt::Widget);
        this->setAttribute(Qt::WA_TranslucentBackground, true);
        cbWid->setBtnLockState(false);
        this->show();
        qDebug() << u8"CodeBook001: 取消窗口为最顶层";
    }
    isWidTop = !isWidTop;
}
运行结果及详细报错内容

如图为点击置顶按钮后,窗口置顶但背景不再透明:

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

尝试通过以下代码解决,但未能达到理想效果:

this->setWindowFlags(Qt::WindowStaysOnTopHint);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
this->setAttribute(Qt::WA_TranslucentBackground, true);
this->show();
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

问题解决了,用的是windows库的方法:

#include <windows.h>

void on_setTopHint() {
    if (!isWidTop) 
        SetWindowPos(HWND(this->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    else 
        SetWindowPos(HWND(this->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    isWidTop = !isWidTop;
}


你可以尝试使用QWidget::setWindowFlags()函数来设置窗口的标志,以使其置顶,同时保持不透明背景:

QWidget::setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); 用|放到一起再set 不然的话会被覆盖吧

ChatGPT:
在QT窗口中,可以通过设置窗口属性来让窗口置顶:

this->setWindowFlags(Qt::WindowStaysOnTopHint);

但是,如果在设置窗口置顶后,再设置窗口的透明背景,则窗口的背景不会变为透明,因为窗口置顶会导致窗口无法接收到透明背景的消息。

解决办法是,在设置窗口置顶之后,再设置窗口的透明背景:

this->setWindowFlags(Qt::WindowStaysOnTopHint);
this->setAttribute(Qt::WA_TranslucentBackground);
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^