Запуск действия/события при потере фокуса PyQt6

Есть кнопка, которая делает какое-то действие:

import sys

from PyQt6 import QtGui
from PyQt6.QtWidgets import QApplication, QVBoxLayout, QPushButton, QWidget

app = QApplication(sys.argv)

class FocusLost(QWidget):
    def __init__(self):
        super().__init__()

        vblo = QVBoxLayout()
        self.btn = QPushButton('Stop record')
        self.btn.clicked.connect(self.record_stopped)
        vblo.addWidget(self.btn)

        self.setLayout(vblo)
        self.show()
        sys.exit(app.exec())

    def record_stopped(self):
        print('record stopped')

    # def focusOutEvent(self, a0: QtGui.QFocusEvent) -> None:
    #     self.btn.click()


fl = FocusLost()

Нужно чтобы она срабатывала (она или сам метод, который она запускает) если окно, которому она принадлежит теряет фокус.
Проще говоря если внезапно всплыло окно посторонней программы, которое перекрывает окно данной программы, должно запускаться определённое действие.
В данном случае это метод record_stopped().


Ответы (1 шт):

Автор решения: S. Nick

void QApplication::focusChanged(QWidget *old, QWidget *now)

Этот сигнал испускается, когда виджет, который имеет фокус клавиатуры, изменился со старого на настоящий, т. Е. Когда пользователь нажал клавишу табуляции, щелкнул виджет или изменил активное окно. И старое, и настоящее могут быть nullptr.

import sys
'''
from PyQt6 import QtGui
from PyQt6.QtWidgets import QApplication, QVBoxLayout, QPushButton, QWidget
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class FocusLost(QWidget):
    def __init__(self):
        super().__init__()

        self.btn = QPushButton('Stop record')
        self.btn.clicked.connect(self.record_stopped)
        
        vblo = QVBoxLayout(self)        
        vblo.addWidget(self.btn)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.setFocus()                                             
        app.focusChanged.connect(self.onFocusChanged)

    def record_stopped(self):
        print('record stopped')

    def onFocusChanged(self):
        print(f' Окно активное (сфокусировано ли окно или нет) ? -> `{self.isActiveWindow()}`')
        if not self.isActiveWindow():
            self.btn.click()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = FocusLost()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка