2017-10-27 16 views
1

いくつかの整数を渡すためにカスタムpyqtSignalを作成しようとしていますが、いくつか問題があります。私は最初の問題を示し、最小の例を提示してみましょう:PyQt5:カスタム信号を使用したときのintオブジェクトの変換が正しくありません

#!/usr/local/bin/python3 
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 
import sys 

class Form(QDialog): 

    post_request = pyqtSignal(int) 

    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 

     self.button = QPushButton('Click Me') 
     self.textbox = QLineEdit(self) 

     layout = QHBoxLayout() 
     layout.addWidget(self.button) 
     layout.addWidget(self.textbox) 
     self.setLayout(layout) 

     self.button.clicked.connect(self.on_button_click) 
     self.post_request.connect(self.test) 

     self.setWindowTitle('Test') 


    def on_button_click(self): 
     try: 
      integer = int(self.textbox.text(), 16) 
      self.post_request.emit(integer) 
     except ValueError: 
      print('wrong input') 


    def test(self, integer): 
     print('I received {0:x}'.format(integer)) 

def run_app(): 
    app = QApplication(sys.argv) 
    form = Form() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    run_app() 

これは(それが非進文字でない限り)テキストボックスに入力したものは何でも出て出力する簡単なウィンドウです。さて、これはほとんどの場合、大丈夫です。しかし、テキストボックスに最上位ビットが設定されている数値を入力すると、何らかの奇妙な動作をします。私は、テキストボックスに0x4afecafeを入力し、ボタンをクリックした場合、それが印刷されます:

は、私は次のような出力になります0xcafecafeに4afecafe

ますがタイピングを受けた:

私はC/C++であれば間違ってされていない-35013502

を受けたが、中Pythonでは、これは私のプログラムを壊します。-35013502 == 0xcafecafeFalseを返します。

は、だから私の質問は以下のとおりです。

  1. ですが、なぜでしょうか? Pythonラッパーの基本的な実装と関係があると思いますが、それを理解できませんでした。
  2. この問題を回避するにはどうすればよいですか?スロットにPython intオブジェクトを受け取るには、0xcafecafeのオブジェクトが必要です。

答えて

1

信号を送信するとき、PyQtは常に対応するC++タイプに変換しようとします。しかし、それができないところでは、代わりに単にPythonオブジェクトへのポインタを送るだけです。だからあなたの問題を回避するための最も簡単な方法は、このように、信号パラメータの特定の型を宣言しないことです。

class Form(QDialog): 
    post_request = pyqtSignal(object) 

今、PyQtははPythonとC++型の変換しようとする試みをすることはありません。これは、C++に相当するものがないtupleのようなPython型のデフォルトの動作を利用しています。

関連する問題