Как показать всплывающую подсказку, не фокусируясь на pyqt5 python? - PullRequest
1 голос
/ 06 марта 2020

Я хочу показать всплывающую подсказку без фокусировки.

Я сделал код, ссылаясь на это Окно PyQt Focus

Но оно работает только после щелчка окна , Работает нормально, но окно всегда мигает на панели задач.

И я думаю, что этот метод неэффективен.

Мне кажется, что ОС не отдыхает, ожидая выполнения задачи, но проверяя каждый момент для выполнения задачи.

Это простое окно, поэтому оно не будет сильно расходовать процессор, но я хочу более эффективно его кодировать.

Есть ли способ улучшить это?

Или этот метод прав, потому что focusoutEvent оправдал только одного? (Ресурс процессора 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_())

1 Ответ

0 голосов
/ 06 марта 2020

У вас проблема XY : вы пытаетесь найти решение (обычно неортодоксальное и чрезмерно сложное) для проблемы, возникшей в другом месте.

Что вы хотите сделать, это показать всплывающие подсказки, даже если окно не сфокусировано, чтобы не восстанавливать фокус окна; чтобы достичь этого, вы не должны повторно активировать окно, когда оно теряет фокус (что не только НЕПРАВИЛЬНО , но является и неправильным способом, и причиной для этого).

Вам просто нужно установить атрибут виджета WA_AlwaysShowToolTips в окне верхнего уровня (и, разумеется, удалить ненужное переопределение 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.<b>window()</b>.setAttribute(QtCore.Qt.WA_AlwaysShowToolTips, True)

Кроме того, мигание нормально на windows и не имеет никакого отношения к использованию процессора:

activWindow () : [...] На Windows, если вы вызываете это, когда приложение в данный момент не является активным, оно не сделает его активным окном. Это изменит цвет записи панели задач, чтобы указать, что окно каким-то образом изменилось. Это потому, что Microsoft не позволяет приложению прерывать то, что пользователь в данный момент делает в другом приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...