我正在尝试创建自定义pyqtSignal以便传递一些整数,但是我遇到了一些问题。让我首先提出一个最小的例子来说明这个问题:

#!/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将产生以下输出:



如果那是C / C++,这是没有错的,但是在Python中,这破坏了我的程序,因为-35013502 == 0xcafecafe返回False

所以我的问题是:
  • 为什么会这样?我想这与Python包装器的底层实现有关,但我不太了解。
  • 如何解决此问题?我希望插槽接收一个包含int的Python 0xcafecafe对象。
  • 最佳答案

    发送信号时,PyQt将始终尝试转换为相应的C++类型。但是在无法做到的地方,它只会发送一个指向Python对象的指针。因此,解决问题的最简单方法是不声明信号参数的特定类型,如下所示:

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

    现在,PyQt不会尝试在Python和C++类型之间进行转换。这是利用tuple这样的Python类型(在C++中没有等效功能)的默认行为。

    关于python - PyQt5:使用自定义信号时,int对象的转换错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46973384/

    10-12 16:48
    查看更多