2017-10-27 26 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

하지만 입력을받은 :

내가받은 -35013502

즉 C/C++ 인 경우 잘못되지

만에 파이썬은 내 프로그램을 깨뜨린다. -35013502 == 0xcafecafeFalse을 리턴한다.

그래서 제 질문은 다음과 같습니다

  1. 왜 이런 일이? 파이썬 랩퍼의 기본 구현과 관련이 있다고 생각하지만 이해할 수는 없습니다.
  2. 이 문제를 해결하려면 어떻게해야합니까? 슬롯에 파이썬 int 객체를 받도록하고 싶습니다. 0xcafecafe.

답변

1

신호를 보낼 때, PyQt는 항상 가능한 대응하는 C++ 유형으로 변환하려고 시도합니다. 그러나 할 수없는 곳에서는 대신 단순히 파이썬 객체에 대한 포인터를 보냅니다. 그래서 당신의 문제를 해결하는 가장 간단한 방법은 다음과 같이, 신호 매개 변수의 특정 유형을 선언하지 않는 것입니다 :

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

이제 PyQt는 어떤 시도가 파이썬과 C++ 유형 사이의 변환하지 않습니다. 이것은 tuple과 같은 파이썬 유형에 대한 기본 동작을 활용합니다.이 동작에는 C++과 동일한 기능이 없습니다.