PyQt5-论如何让窗口置顶

PyQt5-论如何让窗口置顶 | Ariasakaの小窝 (yisous.xyz)

这篇文章讲述了作者在写uClock程序时,如何实现窗口右键直接控制窗口是否置顶的功能。作者通过不断试错,最终找到了解决方案。他发现可以通过设置WindowFlag的方式来控制显示后的窗口是否置顶,但是并不能在运行时实时控制。于是他尝试在程序运行时直接调用这个方法,结果窗口消失了。然后他又加了一句self.show(),窗口重新显示了。但是此时的窗口状态很奇怪,有托盘,还有最小化关闭窗口图标。作者发现是因为并没有继承之前的SplashScreen属性,所以直接继承上以前的窗口状态就好了。取消置顶同理,从以前的windowFlags里面排除掉置顶部分,重新show就可以了。最后作者实现了智能切换功能,并且uClock开源,采用MIT协议。

这其实是一个远古的问题了,突然想起来就顺便分享一下吧

写uClock的时候为了让窗口右键直接控制窗口是否置顶,可没费过我不少心思:因为这玩意实在是太太太坑了,根本没搜索到什么解决方案,在1.0和1.1旧版中根本没有,1.2又因为折腾博客一直卡在dev版本鸽了~~(…)~~

置顶功能效果如下:

20220901171505.gif

这个置顶功能在我不断地试错之后做出来了,期间翻过大量的qt文档和csdn(就是懒得挂梯子

众所周知,可以通过设置WindowFlag的方式来控制显示后的窗口是否置顶,不过并不能在运行时实时控制:

PYTHON

1
self.setWindowFlags(Qt.WindowStaysOnTopHint)

不过我想打破规则看看在运行时能不能使用这个方法

结果我发现在程序运行的时候直接调用这个方法运行的话,窗口会消失。

怎么办呢?

然后我尝试加了一句:

PYTHON

1
self.show()

结果窗口果然就重新显示了:

1662024864424.png

然而现在的窗口状态很奇怪,有托盘,还有最小化关闭窗口图标,实际上是因为并没有继承之前的SplashScreen属性,所以直接继承上以前的窗口状态就好了:

PYTHON

1
2
self.setWindowFlags(Qt.WindowStaysOnTopHint|self.windowFlags())
self.show()

此时窗口置顶的同时也能够继承以前的状态了。

1662025524240.png

取消置顶同理,从以前的windowFlags里面排除掉置顶部分,重新show就可以了

PYTHON

1
2
self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
self.show()

如果要实现智能切换,只需要简单地加一点料,智能判断windowFlags即可:

PYTHON

1
2
3
4
5
6
7
8
#置顶bug终于TM修复了!!!!!!!!!!!!!!!
def pin(self):
    if not (self.windowFlags() | Qt.WindowStaysOnTopHint) == self.windowFlags():
        self.setWindowFlags(Qt.WindowStaysOnTopHint|self.windowFlags())
        self.show()
    else:
        self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
        self.show()

然后你就可以将这个函数引用在你的程序里面实现智能临时置顶功能了!

恭喜你解决了一个世纪难题!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值