C++/QT下,窗口置顶导致透明背景无法设置
此窗口的底窗口为设置透明窗口,叠加显示主layout,正常启动显示正常,包括无边框、透明背景和阴影。现加入一个窗口置顶按钮,用户通过点击此按钮实现锁定窗口置顶和解锁窗口置顶。现代码如下,当用户点击时窗口正常置顶或取消置顶,但背景变黑,即使再加入背景透明设置代码也无济于事,求解!
如图为正常运行:
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;
}
如图为点击置顶按钮后,窗口置顶但背景不再透明:
尝试通过以下代码解决,但未能达到理想效果:
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);
不知道你这个问题是否已经解决, 如果还没有解决的话: