python — PyQt5: неправильное преобразование объекта int при использовании пользовательского сигнала

Я пытаюсь создать кастом 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 в текстовое поле, а затем нажмите кнопку, он напечатает:

Я получил 4afecafe

но печатать в 0xcafecafe приведет к следующему выводу:

Я получил -35013502

Что не так, если это был C / C ++, но в Python это нарушает мою программу, так как -35013502 == 0xcafecafe возвращается False,

Итак, мои вопросы:

  1. Почему это происходит? Я предполагаю, что это как-то связано с базовой реализацией оболочек Python, но я не мог этого понять.
  2. Как я могу обойти эту проблему? Я хочу, чтобы слот получил Python int удержание объекта 0xcafecafe,

1

Решение

При отправке сигналов PyQt всегда будет пытаться конвертировать в соответствующий тип C ++, где это возможно. Но там, где это невозможно, он просто отправит указатель на объект Python. Поэтому самый простой способ обойти вашу проблему — не объявлять конкретный тип параметра сигнала, например:

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

Теперь PyQt не будет пытаться конвертировать между типами Python и C ++. Это использует поведение по умолчанию для типов Python, таких как tuple которые не имеют эквивалента в C ++.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]