如何用PyQt更改光标形状?

29 投票
8 回答
38688 浏览
提问于 2025-04-17 06:47

我有一个简单的应用程序,它会运行一个可能需要几分钟才能完成的过程。我想给用户一个提示,告诉他们正在处理请求,比如把鼠标指针换成沙漏形状。

但是我总是搞不定。我的尝试要么出错,要么没有任何效果。而且我好像在调用鼠标指针的形状时出错了,因为PyQt4.Qt.WaitCursor返回了一个错误,提示这个模块里没有这个内容。

那么,正确的方法是什么呢,才能让用户知道这个过程正在运行呢?

8 个回答

10

ekhumoro的解决方案是对的。这个方案只是为了美观做了一些修改。我用了ekhumoro的方法,但我使用了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
23

虽然Cameron和David的回答很好,可以让整个函数都显示等待光标,但我觉得使用上下文管理器更适合在代码片段中设置等待光标:

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块里:

with wait_cursor():
    # do lengthy process
    pass
71

我觉得你需要的是 QApplication.setOverrideCursor 这个方法:

PyQt5:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
...
QApplication.setOverrideCursor(Qt.WaitCursor)
# do lengthy process
QApplication.restoreOverrideCursor()

PyQt4:

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

撰写回答