如何用PyQt更改光标形状?
我有一个简单的应用程序,它会运行一个可能需要几分钟才能完成的过程。我想给用户一个提示,告诉他们正在处理请求,比如把鼠标指针换成沙漏形状。
但是我总是搞不定。我的尝试要么出错,要么没有任何效果。而且我好像在调用鼠标指针的形状时出错了,因为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()