如何使用PyQt更改光标形状?

Tim*_*man 14 python pyqt cursor pyqt4 pyqt5

我有一个简单的应用程序,它运行一个可以在完成之前持续几分钟的过程.所以我试图向用户提供一个指示器,它正在处理请求,例如将光标更改为沙漏.

但我不能让它正常工作.我的所有尝试都导致错误或无效.我似乎错误地调用了cursorshapes PyQt4.Qt.WaitCursor返回一个模块不包含它的错误.

向用户指示进程正在运行的正确方法是什么?

ekh*_*oro 41

我认为QApplication.setOverrideCursor是您正在寻找的:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
...
QApplication.setOverrideCursor(Qt.WaitCursor)
# do lengthy process
QApplication.restoreOverrideCursor()
Run Code Online (Sandbox Code Playgroud)

  • 注意:这适用于 PyQt4。然而Linux(Ubuntu 16.10)下的PySide 1.2.2显示“X错误:BadCursor(无效的光标参数)6”“主要操作码:2(X_ChangeWindowAttributes)”“资源id:0xa”。提供 PySide 的 setOverrideCursor(Qt.WaitCursor) 而不是 setOverrideCursor(QCursor(Qt.WaitCursor)) 有效 - 尽管文档说需要 QCursor() 。在某些情况下,恢复时会出现类似的错误。这似乎是一个已知的 PySide 错误。 (2认同)

dbc*_*dbc 13

虽然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()
Run Code Online (Sandbox Code Playgroud)

然后将冗长的进程代码放在with块中:

with wait_cursor():
    # do lengthy process
    pass
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单、最优雅、最通用的 (2认同)

小智 10

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
Run Code Online (Sandbox Code Playgroud)

我可以把装饰器放在我希望微调器处于活动状态的任何方法上.

class MyWigdet(QMainWidget):

    # ...

    @waiting_effects
    def doLengthyProcess(self):
        # do lengthy process
        pass
Run Code Online (Sandbox Code Playgroud)