【问题标题】:How to show tooltip while not focusing at pyqt5 python?如何在不关注 pyqt5 python 的情况下显示工具提示?
【发布时间】:2020-03-05 22:40:47
【问题描述】:

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

我参考这个PyQt Window Focus做了代码

但是,它只在单击一个窗口后起作用。工作正常,但窗口总是在任务栏闪烁。

而且我认为这种方法效率低。

我觉得好像os在等待任务到来的时候不是在休息,而是每时每刻都在检查任务的到来。

这是一个简单的window窗口,所以不会占用太多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_())

【问题讨论】:

  • 我想你使用的是 Windows,对吧?
  • @musicamante 是的
  • 重新聚焦时显示工具提示有什么需要?它应该出现在哪里?
  • @musicamante 按钮名称为数字,工具提示显示图像。只是看起来像普通的工具提示(如邮政编码)
  • 抱歉,您的回答不清楚。为什么在将焦点返回给窗口后需要显示工具提示?工具提示应该出现在哪里?

标签: python python-3.x pyqt pyqt5


【解决方案1】:

你有一个XY problem:试图为源自其他地方的问题找到解决方案(通常是非正统且过于复杂)。

您想要做的是即使窗口没有获得焦点也显示工具提示,而不是恢复窗口的焦点;要实现这一点,您不得在窗口失去焦点时重新激活它(这不仅是错误,而且是错误的方式和这样做的原因)。

您只需在顶层窗口中设置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 上,如果您在应用程序当前不是活动的应用程序时调用它,那么它不会使其成为活动窗口。 它会改变任务栏条目的颜色,以表明窗口发生了某种变化。这是因为微软不允许应用程序中断用户当前在另一个应用程序中所做的事情。 p>

【讨论】:

  • 你是怎么找到WA_AlwaysShowToolTips的?我在google上用tooltip、focus、window搜索,但是什么都没有出来...如果有什么方法可以在reference上找到func,我想学习。
  • 阅读答案中的 widget 属性 链接,我不把它们放在那里只是为了好玩... ;)
  • 我像this 一样搜索了 5 个小时没有出来,所以我想知道是否有办法查找参考。无论如何感谢您的帮助。
  • 我从不使用 qt 站点搜索,尤其是对于像您这样的“语义”搜索(尽管“智能”,当前的搜索算法仍然基于字面词,而不是它们的含义,尤其是当仅限于单个网站)。唯一的解决办法就是耐心研究文档,对类和它们的功能更加熟悉(必备类毫无疑问是QObject和QWidget,但是阅读所有QtCore.Qt enum/flags也是一件好事)。这需要时间,但 Qt 是一个、复杂而全面的框架,你不能指望只将它用于“随机”搜索。
  • 考虑一下:你花了 5 个小时才找到什么。在相同的时间内,您可以(至少)完整阅读 QWidget 和 QtCore.Qt 页面,您可能会在一半的时间内找到您正在寻找的东西,同时仍然学习很多其他的东西不知道... :)
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2023-04-07
  • 2016-05-03
相关资源
最近更新 更多