2011-11-21 22 views
13

Tôi có một ứng dụng đơn giản chạy một quy trình có thể kéo dài vài phút trước khi hoàn thành. Vì vậy, tôi đang cố gắng cung cấp một chỉ báo cho người dùng rằng nó đang xử lý yêu cầu, chẳng hạn như thay đổi con trỏ thành một đồng hồ cát.Làm cách nào để thay đổi hình dạng con trỏ bằng PyQt?

Nhưng tôi không thể làm cho nó hoạt động đúng. Tất cả các nỗ lực của tôi đã dẫn đến lỗi hoặc không có hiệu lực. Và tôi dường như gọi các cursorshapes không chính xác PyQt4.Qt.WaitCursor trả về một lỗi mà module không chứa nó.

Cách chính xác để chỉ ra cho người dùng rằng quy trình đang chạy là gì?

Trả lời

34

Tôi nghĩ QApplication.setOverrideCursor là những gì bạn đang tìm kiếm: giải pháp

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

Cảm ơn, điều đó hoạt động hoàn hảo. – TimothyAWiseman

+0

Lưu ý: Tính năng này hoạt động trong PyQt4. Tuy nhiên PySide 1.2.2 trong Linux (Ubuntu 16.10) nói "Lỗi X: BadCursor (tham số Con trỏ không hợp lệ) 6" "Mã hóa chính: 2 (X_ChangeWindowAttributes)" "Tài nguyên id: 0xa". Cho ăn setOverrideCursor (Qt.WaitCursor) của PySide thay vì setOverrideCursor (QCursor (Qt.WaitCursor)) hoạt động - mặc dù tài liệu nói rằng QCursor() là cần thiết. Trong một số trường hợp, có lỗi tương tự cho việc khôi phục. Điều này dường như là một lỗi PySide đã biết. – Ubuntourist

+0

@Ubuntourist. Cảm ơn - Tôi có thể xác nhận lỗi trong PySide. Lớp 'QCursor' có một hàm tạo bản sao có giá trị enum' Qt.CursorShape', do đó, không thực sự cần thiết để sử dụng 'QCursor'. Tôi cho rằng việc tạo ra 'QCursor' ở phía Qt là điều sửa lỗi vấn đề PySide. – ekhumoro

9

ekhumoro là đúng. Giải pháp này là một sửa đổi vì lợi ích của phong cách. Tôi đã sử dụng những gì ekhumor đã làm nhưng sử dụng một trang trí 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 

Tôi chỉ có thể đặt trang trí theo bất kỳ phương pháp nào tôi muốn máy quay hoạt động.

class MyWigdet(QMainWidget): 

    # ... 

    @waiting_effects 
    def doLengthyProcess(self): 
     # do lengthy process 
     pass 
+1

Trang trí là một ý tưởng tuyệt vời, cảm ơn. Tôi khuyên bạn nên gọi hàm 'function (* args, ** kwargs)', trả về giá trị trả về 'function', và kết thúc cuộc gọi của nó trong một khối' try ... finally' để có thêm sự tốt đẹp. Tôi dường như không thể đưa điều đó vào bình luận này, vì vậy tiếp theo tôi sẽ thử chỉnh sửa giải pháp của bạn. –

+1

Thay đổi khối thử thành 'hàm trả về (* args, ** kwargs)' cũng có thể hữu ích, hoặc ít nhất là trong trường hợp của tôi. –

0

Better theo cách này:

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 
7

Trong khi câu trả lời của Cameron và David là tuyệt vời cho việc thiết lập con trỏ chờ đợi trên toàn bộ một chức năng, tôi thấy rằng một người quản lý bối cảnh hoạt động tốt nhất cho việc thiết lập con trỏ chờ đợi cho các đoạn mã:

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

Sau đó đặt mã quá trình dài trong một với khối:

with wait_cursor(): 
    # do lengthy process 
    pass 
+0

Điều này đơn giản, thanh lịch và linh hoạt nhất – Schollii

Các vấn đề liên quan