PyQt5 обнаруживает событие предупреждения

#python #python-3.x #pyqt #pyqt5 #alert

#python #python-3.x #pyqt #pyqt5 #предупреждение

Вопрос:

есть ли способ определить, когда alert происходит в главном окне? Я знаю, что есть showEvent и closeEvent , но есть ли alertEvent эквивалент?

Что я надеюсь сделать, так это запустить alert , чтобы встроенные оповещения QApplication могли определять, когда это предупреждение происходит, а также когда это предупреждение очищается. Предупреждение заставит значок панели задач Windows мигать оранжевым цветом, а когда пользователь вернет окно обратно, мигание прекращается и предупреждение очищается.

Проще говоря, я хочу определить, когда начинается мигание и когда заканчивается мигание.

Ниже я опубликую простой фрагмент кода для того, что я думаю.

Main.py

 import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
import time



class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()


        self.central_widget = QtWidgets.QWidget()
        self.setCentralWidget(self.central_widget)
        vbox = QtWidgets.QVBoxLayout()
        self.central_widget.setLayout(vbox)

        self.start_pushButton = QtWidgets.QPushButton()
        self.start_pushButton.setText("Alert")
        self.start_pushButton.clicked.connect(self.wait)
        vbox.addWidget(self.start_pushButton)


    def wait(self):
        main_window.showMinimized()
        time.sleep(2)
        print("Alert")
        app.alert(self,0)

    def event(self,evt):
        print(evt)
        return True

    def alertDetectedJob(self):
        print("Alert Detected")

    def alertClearedJob(self):
        print("Alert Cleared")


app = QtWidgets.QApplication(sys.argv)
main_window = MyMainWindow()
main_window.show()
sys.exit(app.exec_())
  

Ответ №1:

Протестировано для Windows!

Внимание! В Windows это приводит к тому, что запись на панели задач окна некоторое время мигает. Если мсек равен нулю, мигание прекратится, и запись на панели задач станет другого цвета (в настоящее время оранжевого).

 import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
#import time


class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.central_widget = QtWidgets.QWidget()
        self.setCentralWidget(self.central_widget)
        vbox = QtWidgets.QVBoxLayout()
        self.central_widget.setLayout(vbox)

        self.start_pushButton = QtWidgets.QPushButton()
        self.start_pushButton.setText("Alert")
        self.start_pushButton.clicked.connect(self.wait)
        vbox.addWidget(self.start_pushButton)

#     vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.flagWindowDeactivate = False                   #    
        
        self.timer = QtCore.QTimer(self)       
        self.timer.timeout.connect(self.update_func)     
        self.timer.start(5500)                              #   5500
                                                            #   ^^
    def update_func(self):                        
        QtWidgets.QApplication.alert(self, 5000)            #   5000
        if self.flagWindowDeactivate:                       #   ^
            self.alertDetectedJob()
        else: 
            self.alertClearedJob()

    def wait(self):
        self.showMinimized()
#        main_window.showMinimized()
#        time.sleep(2)
#        print("Alert")
#        app.alert(self, 0)
        QtWidgets.QApplication.alert(self, 5000)            #   5000
                                                            #   ^
    def event(self, event):
#        print(event.type())
        if event.type() == QtCore.QEvent.WindowDeactivate:  # !!!
            print('WindowDeactivate')
            self.flagWindowDeactivate = True
        if event.type() == QtCore.QEvent.WindowActivate:    # !!!
            print('WindowActivate')
            self.flagWindowDeactivate = False
        return True
#     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def alertDetectedJob(self):
        print("Alert Detected")

    def alertClearedJob(self):
        print("Alert Cleared")          


app = QtWidgets.QApplication(sys.argv)
main_window = MyMainWindow()
main_window.show()
sys.exit(app.exec_())