Не меняется курсор мыши при завершении логики в потоке PyQt

Реализовал не сложную логику. При нажатии кнопки в приложении pyqt в новом потоке происходят определенные действия. Я хочу, чтобы пока происходили эти действия, курсор мыши менялся на ожидание.

Проблема сейчас в том, что после завершения действий курсор не обновляется. Но если вывести мышь за пределы экрана, а потом вернуть - тогда курсор все же меняется. Не могу понять, почему так происходит.

Сейчас мой код выглядит примерно так:

class Win(QtWidgets.QMainWindow, design.Ui_MainWindow):
    def __init__(self):
        self.btnAnalize.clicked.connect(self.start_analize)

   def start_analize(self):
        """Действия при нажатия кнопки анализа"""
        analize = Analize()
        self.thread_pool.start(analize)

class Analize(QRunnable):
    def __init__(self):
        super(Analize, self).__init__()

    @pyqtSlot()
    def run(self):
        # меняем курсор мыши
        QApplication.setOverrideCursor(Qt.WaitCursor)
        # Тут происходят какие-то действия
        # Восстанавливаем курсов
        QApplication.restoreOverrideCursor()

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

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

Ваша задача должна выглядеть так:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class Signals(QtCore.QObject):                            # +++
    started = QtCore.pyqtSignal()
    finished = QtCore.pyqtSignal()


class Analize(QRunnable):
    def __init__(self):
        super(Analize, self).__init__()
        self.signal = Signals()

    @pyqtSlot()
    def run(self):
        # меняем курсор мыши
#        QApplication.setOverrideCursor(Qt.WaitCursor)
        self.signal.started.emit()

        # Тут происходят какие-то действия
        QtCore.QThread.msleep(3000)

        # Восстанавливаем курсов
#        QApplication.restoreOverrideCursor()
        self.signal.finished.emit()


class Win(QtWidgets.QMainWindow):   #, design.Ui_MainWindow):
    def __init__(self):
        super().__init__() 

        self.btnAnalize = QPushButton('Start', self)
        self.btnAnalize.clicked.connect(self.start_analize)

        self.thread_pool = QThreadPool()

    def start_analize(self):
        """Действия при нажатия кнопки анализа"""
        self.analize = Analize()
        self.analize.signal.started.connect(self.onStart)
        self.analize.signal.finished.connect(self.onFinished)

        self.thread_pool.start(self.analize)

    def onStart(self):
        QApplication.setOverrideCursor(Qt.WaitCursor)   

    def onFinished(self):
        QApplication.restoreOverrideCursor()  

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Win()
    w.show()
    sys.exit(app.exec_())        
→ Ссылка