5

0〜2^32-1の範囲の大きな整数のシグナル/スロットを使用しようとしています。少し奇妙なことを発見しました。7FFFFFFFを超える境界を発行すると、スロットの実行後にOverflowError例外がスローされます。IまたはQTがCやC++などの別の言語で符号付き32ビット整数を明示的に使用している場合、この種のオーバーフローが予想される可能性があります。ただし、Pythonでは、ラップなしで2^32になります。しかし、コードを書くときの私の仮定は、これはpythonであり、組み込みのintは非常に大きくなる可能性があり(おそらく任意のようになりますか?)、32ビットまたは64ビットまたは符号付き/符号なしとして明示的に定義する必要はないということでした。それはすべてうまくいくでしょう。

以下のコードは、私が見ているものを示しています(Python 2.7.2(64ビット)、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

正確な出力は次のとおりです。

2147483647と言う
-2147483648と言います
OverflowError
2147483648と言う
  1. Qtが整数型のシグナル/スロットをPython組み込みintではなく符号付き32ビット整数を処理するかのように扱うように見えるのはなぜですか?
  2. これがQtの制限である場合、intを符号なしとしてマークする、またはQTが0x7FFFFFFFを超える整数を処理できることを確認するにはどうすればよいですか?
4

1 に答える 1

6

私は主に PyQt ユーザーですが、動作は似ていると思います。intシグナル定義では、4 バイト整数にマップされます (Qt が を理解するためint)。

考えられる解決策の 1 つは、シグナルが Python オブジェクトを発行するように強制することです。これは機能します:

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

intただし、この信号を Qt のバージョン(たとえばQtGui.QSpinBox.setMaximum) を期待するスロットに接続すると、同じ動作が見られることに注意してください。それ以外は、このシグナルを純粋に Python 側で使用しても問題ありません。

于 2012-05-26T02:04:58.813 に答える