Не меняется курсор мыши при завершении логики в потоке 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_())