24

完了するまでに数分間かかるプロセスを実行する単純なアプリケーションがあります。カーソルを砂時計に変更するなど、リクエストを処理していることをユーザーに示すようにしています。

しかし、私はそれを正しく機能させることはできません。私の試みはすべて、エラーが発生するか、効果がありませんでした。PyQt4.Qt.WaitCursorまた、モジュールに含まれていないというエラーが返されるため、カーソル形状を間違って呼び出しているようです。

プロセスが実行中であることをユーザーに示す正しい方法は何ですか?

4

7 に答える 7

58

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()
于 2011-11-21T22:19:17.550 に答える
19

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
于 2016-02-11T16:55:15.240 に答える
10

エクモロの解決策は正しいです。このソリューションは、スタイルのための変更です。私は 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
于 2013-11-30T02:24:33.990 に答える
0

私はしばしばする必要があると思います:

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()

それ以外の場合、@ Guimout が言及したのと同様に、マウスがそれを変更するウィジェット (QLineEdit など) の上を通過するまで、カーソルは「復元」されません。

于 2020-04-06T19:52:02.773 に答える