Как я могу изменить форму курсора с помощью PyQt? - PullRequest
14 голосов
/ 22 ноября 2011

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

Но я не могу заставить его работать правильно. Все мои попытки привели к ошибке или не дали результата. И я, кажется, неправильно называю формы курсора PyQt4.Qt.WaitCursor возвращает ошибку, что модуль не содержит его.

Как правильно указать пользователю, что процесс запущен?

Ответы [ 4 ]

38 голосов
/ 22 ноября 2011

Я думаю QApplication.setOverrideCursor - это то, что вы ищете:

from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication
...
QApplication.setOverrideCursor(Qt.WaitCursor)
# do lengthy process
QApplication.restoreOverrideCursor()
13 голосов
/ 11 февраля 2016

Хотя ответы Кэмерона и Дэвида отлично подходят для установки курсора ожидания на всю функцию, я считаю, что контекстный менеджер лучше всего подходит для установки курсора ожидания для фрагментов кода:

from contextlib import contextmanager
from PyQt4 import QtCore
from PyQt4.QtGui import QApplication, QCursor

@contextmanager
def wait_cursor():
    try:
        QApplication.setOverrideCursor(QCursor(QtCore.Qt.WaitCursor))
        yield
    finally:
        QApplication.restoreOverrideCursor()

Затем поместите длинный код процесса в блок с:

with wait_cursor():
    # do lengthy process
    pass
10 голосов
/ 30 ноября 2013

Решение Эхуморо правильное.Это решение является модификацией ради стиля.Я использовал то, что сделал Эхумор, но использовал декоратор python.

from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication, QCursor, QMainWidget

def waiting_effects(function):
    def new_function(self):
        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
        try:
            function(self)
        except Exception as e:
            raise e
            print("Error {}".format(e.args[0]))
        finally:
            QApplication.restoreOverrideCursor()
    return new_function

Я могу просто установить декоратор на любой метод, для которого я хочу, чтобы спиннер был активным.

class MyWigdet(QMainWidget):

    # ...

    @waiting_effects
    def doLengthyProcess(self):
        # do lengthy process
        pass
0 голосов
/ 12 ноября 2015

Лучше так:

def waiting_effects(function):
    def new_function(*args, **kwargs):
        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
        try:
            return function(*args, **kwargs)
        except Exception as e:
            raise e
            print("Error {}".format(e.args[0]))
        finally:
            QApplication.restoreOverrideCursor()
    return new_function
...