这个问题持续了有段时间,我以“PyQt/PySide 设置窗口置顶 setWindowFlags 窗口闪”等关键词在一篇使用C写的代码解决方案中找到了答案
原文链接QT实现窗口置顶、置顶状态切换、多窗口置顶优先关系 - 知乎 (zhihu.com)
void Widget::on_pushButton_clicked()
{
if(!istop)
{
// Qt::WindowFlags m_flags = windowFlags();
// setWindowFlags(m_flags | Qt::WindowStaysOnTopHint);
// show();
qDebug()<<"always top";
QWindow* pWin = this->windowHandle();
pWin->setFlags(Qt::Widget | Qt::WindowStaysOnTopHint);
}else{
//Qt::WindowFlags m_flags = windowFlags();
// setWindowFlags(Qt::Widget);
// //setWindowFlags(NULL);
// show();
QWindow* pWin = this->windowHandle();
pWin->setFlags(Qt::Widget);
qDebug()<<"no always top";
}
istop=!istop;
}
原文中放弃使用setWindowFlags,而是
QWindow* pWin = this->windowHandle();
pWin->setFlags(Qt::Widget)
所以我们在Python中把self.setWindowFlags(Qt.WindowStaysOnTopHint)改为:
m_flags = self.windowFlags() # 没有这行代码会使窗口的标题栏消失
self.windowHandle().setFlags(m_flags | Qt.WindowType.WindowStaysOnTopHint)
其中self调用的是已实例化的类对象QMainwindow。
综上所述,如果你的代码中使用了下面的方式置顶窗口或设置窗口属性:
self.setWindowFlags(Qt.WindowType.WindowStaysOnTopHint) # 此方法导致窗口隐藏
self.show()
改成下面的代码即可解决问题
m_flags = self.windowFlags() # 没有这行代码会使窗口的标题栏消失
self.windowHandle().setFlags(m_flags | Qt.WindowType.WindowStaysOnTopHint)