我想在不聚焦时显示工具提示。
我通过参考此PyQt Window Focus编写了代码
但是,它仅在单击窗口后起作用。工作正常,但窗口始终在任务栏上闪烁。
而且我认为这种方法效率低下。
我认为这似乎是操作系统在等待任务到来时没有休息,而是在每时每刻检查任务来了。
这是一个简单的窗口,因此它不会占用太多的CPU,但我想更有效地对其进行编码。
有什么方法可以改善这一点?
或者此方法正确,因为focusoutEvent仅执行一个? (Cpu资源0%)
如果正确,如何删除任务栏上的闪烁?
我检查参考focusPolicy-prop
import sys, os
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.setFocusPolicy(QtCore.Qt.ClickFocus)
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
vbox.addStretch(2)
btn = QPushButton("Test")
btn.setToolTip("This tooltip")
vbox.addWidget(btn)
vbox.addStretch(1)
self.setLayout(vbox)
self.setGeometry(300, 300, 300, 200)
self.show()
def focusOutEvent(self, event):
self.setFocus(True)
self.activateWindow()
self.raise_()
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
您正在使用XY problem:试图为起源于其他地方的问题找到解决方案(通常是非正统的并且过于复杂)。
您要做的是即使窗口未聚焦也要显示工具提示,而不是恢复窗口的聚焦;要实现此目的,您必须]在窗口失去焦点时重新激活窗口(这不仅是WRONG,而且是错误的方式和这样做的理由)。
[您只需要在顶级窗口上设置WA_AlwaysShowToolTips
widget attribute(显然,删除不必要的focusOutEvent
覆盖)。
class MyApp(QWidget): def __init__(self): super().__init__() self.setFocusPolicy(QtCore.Qt.ClickFocus) self.initUI() self.setAttribute(QtCore.Qt.WA_AlwaysShowToolTips, True)
请注意,必须在顶级窗口]的窗口小部件上设置属性,因此,除非您使用QMainWindow或您完全确定QWidget始终是窗口,否则通常最好改为执行此操作:
这是因为Microsoft不允许应用程序中断用户当前在其他应用程序中所做的操作。self.window().setAttribute(QtCore.Qt.WA_AlwaysShowToolTips, True)
除此之外,闪烁在Windows上是正常现象,与CPU使用率无关:
activateWindow():[...]在Windows上,如果您在应用程序当前不是活动的应用程序时调用它,则不会使其成为活动的窗口。 它将更改任务栏条目的颜色,以指示窗口已以某种方式更改。