代码之家  ›  专栏  ›  技术社区  ›  576i

如何在Python PySide2(用于Python的Qt)中将windows光标设置为沙漏(等待)[重复]

  •  0
  • 576i  · 技术社区  · 7 年前

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

    但我不能让它正常工作。我所有的尝试要么导致错误,要么没有效果。我似乎对光标形状的称呼不正确,因为 PyQt4.Qt.WaitCursor 返回模块不包含它的错误。

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

    0 回复  |  直到 4 年前
        1
  •  58
  •   ekhumoro    6 年前

    我想 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()
    
        2
  •  19
  •   dbc    10 年前

    虽然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
    
        3
  •  10
  •   Sandy Chapman    10 年前

    Ekhumaro的解决方案是正确的。这个解决方案是为了风格而修改的。我使用了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
    

    我可以用任何我想让微调器激活的方法来设置装饰器。

    class MyWigdet(QMainWidget):
    
        # ...
    
        @waiting_effects
        def doLengthyProcess(self):
            # do lengthy process
            pass
    
        4
  •  1
  •   David Miró    10 年前

    这样更好:

    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
    
        5
  •  0
  •   Sunil Kumar Nerella    6 年前

    根据我的说法,添加光标的最佳方法是使用装饰器。通过这种方式,只需将光标作为装饰器添加到该函数中,就可以运行任何函数

    import decorator
    @decorator.decorator
    def showWaitCursor(func, *args, **kwargs):
        QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
        try:
            return func(*args, **kwargs)
        finally:
            QtWidgets.QApplication.restoreOverrideCursor()
    
    @showWaitCursor
    def youFunc():
        # Long process
    
        6
  •  0
  •   Nat    6 年前

    我发现我经常需要做:

    QApplication.setOverrideCursor(Qt.WaitCursor)
    QApplication.ProcessEvents()
    ...
    QApplication.restoreOverrideCursor()
    

    然而在GUI初始化期间,我发现出于某些原因需要进行修改:

    self.ui.show()  # Or your equivalent code to show the widget
    QApplication.processEvents()
    QApplication.setOverrideCursor(Qt.WaitCursor)
    app.processEvents()
    ...
    QApplication.restoreOverrideCursor()
    

    否则,直到鼠标经过修改它的小部件(如QLineEdit)时,光标才会“恢复”,这与@Guimoute提到的类似

        7
  •  0
  •   etrimaille    5 年前

    您可以使用QgsTemporaryCursorOverride类 https://qgis.org/api/classQgsTemporaryCursorOverride.html

    但在Python中,您应该使用PyQGIS中现在包含的Python上下文管理器:

    from qgis.PyQt.QtCore import Qt
    from qgis.utils import OverrideCursor
    
    with OverrideCursor(Qt.WaitCursor):
        do_a_slow(operation)