如何在不关注pyqt5 python时显示工具提示?

问题描述 投票:0回答:1

我想在不聚焦时显示工具提示。

我通过参考此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_())
python python-3.x pyqt pyqt5
1个回答
0
投票

您正在使用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始终是窗口,否则通常最好改为执行此操作:


    self.window().setAttribute(QtCore.Qt.WA_AlwaysShowToolTips, True)

除此之外,闪烁在Windows上是正常现象,与CPU使用率无关:

activateWindow():[...]在Windows上,如果您在应用程序当前不是活动的应用程序时调用它,则不会使其成为活动的窗口。 它将更改任务栏条目的颜色,以指示窗口已以某种方式更改。

这是因为Microsoft不允许应用程序中断用户当前在其他应用程序中所做的操作。
© www.soinside.com 2019 - 2024. All rights reserved.