2012-05-26 14 views
5

Tôi đang cố sử dụng tín hiệu/khe với số nguyên lớn từ 0 - 2^32-1. Tôi đã phát hiện ra điều gì đó hơi kỳ lạ - một khi tôi phát ra> ranh giới 7FFFFFFF, tôi nhận được ngoại lệ OverflowError được ném sau khi khe được chạy. Tôi có thể mong đợi loại tràn này nếu tôi hoặc QT rõ ràng sử dụng một số nguyên 32 bit đã ký bằng một ngôn ngữ khác như C hoặc C++ - vì chúng ta đều biết 0x80000000 kết thúc tốt đẹp trở lại -2^31 trong ký hiệu bổ sung 2 giây. Trong python, chỉ có 2^32 mà không cần gói. Giả định của tôi khi viết mã mặc dù là đây là python và int tích hợp có thể phát triển rất lớn (có thể là arbitrarilly như vậy?) Và tôi không rõ ràng cần xác định thứ gì đó là 32 hoặc 64 bit hoặc đã ký/unsigned. Nó sẽ chỉ hoạt động.Trong Pyside, tại sao phát ra một kết quả số nguyên> 0x7FFFFFFF trong "OverflowError" sau khi tín hiệu được xử lý?

Đoạn code dưới đây cho thấy những gì tôi nhìn thấy (Python 2.7.2 (64 bit), Pyside 1.1.0, Windows 7)

from PySide.QtCore import * 

@Slot(int) 
def say(i): 
    print "Say %i" % i 

class Communicate(QObject): 
    speak = Signal(int) 

someone = Communicate() 
someone.speak.connect(say) 
someone.speak.emit(0x7FFFFFFF) #works fine 
someone.speak.emit(0x80000000) #OverflowError after slot "say" runs 
say(0x80000000)    #works fine 

Sản lượng chính xác là:

 
Say 2147483647 
Say -2147483648 
OverflowError 
Say 2147483648 
  1. Tại sao Qt dường như xử lý các tín hiệu/khe của kiểu số nguyên như thể giao dịch với các số nguyên 32 bit đã ký và không phải là mã int tích hợp python?
  2. Nếu đây là hạn chế của Qt, tôi có thể làm gì để đánh dấu int là chưa ký hoặc đảm bảo QT có thể xử lý các số nguyên> 0x7FFFFFFF?
+1

"chúng ta đều biết 0x80000000 kết thúc tốt đẹp trở lại -1" - tôi không nghĩ rằng nó thay đổi bất cứ điều gì, nhưng 0xfffffffff là -1 và 0x80000000 là số nguyên âm 32 bit lớn nhất trong phần bổ sung 2 giây. –

+0

@andrewcooke bạn đúng, tôi đã sửa câu hỏi. –

+3

Rõ ràng Qt đưa ra các giả định không phù hợp với Python. –

Trả lời

5

Tôi chủ yếu là người dùng PyQt, nhưng tôi tin rằng hành vi tương tự. int trong định nghĩa tín hiệu được ánh xạ tới số nguyên 4 byte (như Qt hiểu được int).

Một giải pháp khả thi là buộc tín hiệu phát ra một đối tượng Python. Đây hoạt động:

class Communicate(QObject): 
    speak = Signal(object) 

Nhưng lưu ý rằng, nếu bạn kết nối tín hiệu này cho một khe mà hy vọng phiên bản của int của Qt (ví dụ QtGui.QSpinBox.setMaximum), bạn sẽ thấy các hành vi tương tự. Khác hơn thế, sử dụng tín hiệu này hoàn toàn ở phía bên Python sẽ ổn.

+0

Cảm ơn. Bạn có một liên kết nói int trong định nghĩa tín hiệu được gắn với khái niệm của QT (hoặc C++) của một int và không để pythons? –

+1

@DougT. : PyQt làm điều đó [theo cách đó] (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html). Cụ thể: _ "Khi một tín hiệu được phát ra thì bất kỳ đối số nào được chuyển đổi thành kiểu C++ nếu có thể." _ Và [PySide nói] (http://www.pyside.org/docs/pyside/PySide/QtCore/Signal.html) , nó thực hiện cùng một giao diện. 'int' có biểu diễn C++ trực tiếp. – Avaris

+0

Tài liệu bổ sung, tất cả các ví dụ trong tín hiệu kiểu mới và vị trí điểm tại "int" có nghĩa là số nguyên C http://qt-project.org/wiki/Signals_and_Slots_in_PySide –