Подтвердить что ты не робот

Как изменить форму курсора с помощью PyQt?

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

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

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

4b9b3361

Ответ 1

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

from PyQt4.QtCore import Qt
from PyQt4.QtGui import QApplication
...
QApplication.setOverrideCursor(Qt.WaitCursor)
# do lengthy process
QApplication.restoreOverrideCursor()

Ответ 2

Решение ekhumoro правильное. Это решение является модификацией для стиля. Я использовал то, что сделал ekhumor, но использовал декоратор 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

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

class MyWigdet(QMainWidget):

    # ...

    @waiting_effects
    def doLengthyProcess(self):
        # do lengthy process
        pass

Ответ 3

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

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

Ответ 4

Лучше так:

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