PySide信号和插槽似乎在默默地将我的二进制字符串转换为unicode。我怎么才能避免呢?或者,如何通过signals-slots接口传递二进制数据,而不使用PySide对其进行更改?
from PySide import QtCore
class Thingy(QtCore.QObject):
data = QtCore.Signal(str)
@QtCore.Slot(str)
def printdata(x):
print "type=%s, x=%s" % (type(x), x.__repr__())
thingy = Thingy()
thingy.data.connect(printdata)
for data in ('Hey', '\x55\xaa'):
printdata(data)
thingy.data.emit(data)这将打印出来:
type=<type 'str'>, x='Hey'
type=<type 'unicode'>, x=u'Hey'
type=<type 'str'>, x='U\xaa'
type=<type 'unicode'>, x=u'U\xaa'发布于 2014-07-08 16:10:50
您只需将信号和插槽中的类型说明符替换为object,PySide将不会调用任何转换。
from PySide import QtCore
class Thingy(QtCore.QObject):
data = QtCore.Signal(object)
@QtCore.Slot(object)
def printdata(x):
print "type=%s, x=%s" % (type(x), x.__repr__())
thingy = Thingy()
thingy.data.connect(printdata)
for data in ('Hey', '\x55\xaa'):
printdata(data)
thingy.data.emit(data)给出
type=<type 'str'>, x='Hey'
type=<type 'str'>, x='Hey'
type=<type 'str'>, x='U\xaa'
type=<type 'str'>, x='U\xaa'这允许您发送二进制数据。
发布于 2014-07-08 07:26:24
我正在为python2编写代码,在python3中,这种情况可能更明智(但我不确定)。
在Qt中,string类是QString。当pyside想要将一个QString传递给python时,它会选择unicode类型。这是一件好事,因为QString支持unicode。没有办法告诉Qt库,QString实际上应该是一个字节数组,所以一旦您的python str被转换为QString,您将得到一个unicode。由此可以看出,当您将字符串传递到Qt中,并且pyside将python字符串转换为QString时,问题就真的发生了。
为什么pyside将python str转换为QString而不是例如。QByteArray?在python 2中,字节数组没有单独的类型,因此str具有字节数组和文本的双重功能。我猜测QString是默认的,因为字符串通常表示文本。
如果您有ASCII文本,最简单的解决方案是在插槽开始时调用str():
@QtCore.Slot(str)
def printdata(x):
x = str(x)
print "type=%s, x=%s" % (type(x), x.__repr__())然而,正如你在问题中所说的,你有二进制数据,所以这是不起作用的。一种解决方案是告诉信号接受您自己的自定义类型:
class Thingy(QtCore.QObject):
data = pyqtSignal(<your custom byte array type>)然后,您可以创建自己的字节数组类型,它在幕后使用str (确保它是一个新的样式类)。
最后,您可以只使用QByteArray:
class Thingy(QtCore.QObject):
data = pyqtSignal(QByteArray)https://stackoverflow.com/questions/24620936
复制相似问题