首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止PySide信号和插槽尝试将二进制字符串数据转换为Unicode?

如何防止PySide信号和插槽尝试将二进制字符串数据转换为Unicode?
EN

Stack Overflow用户
提问于 2014-07-08 06:28:31
回答 2查看 697关注 0票数 3

PySide信号和插槽似乎在默默地将我的二进制字符串转换为unicode。我怎么才能避免呢?或者,如何通过signals-slots接口传递二进制数据,而不使用PySide对其进行更改?

代码语言:javascript
复制
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)

这将打印出来:

代码语言:javascript
复制
type=<type 'str'>, x='Hey'
type=<type 'unicode'>, x=u'Hey'
type=<type 'str'>, x='U\xaa'
type=<type 'unicode'>, x=u'U\xaa'
EN

回答 2

Stack Overflow用户

发布于 2014-07-08 16:10:50

您只需将信号和插槽中的类型说明符替换为object,PySide将不会调用任何转换。

代码语言:javascript
复制
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)

给出

代码语言:javascript
复制
type=<type 'str'>, x='Hey'
type=<type 'str'>, x='Hey'
type=<type 'str'>, x='U\xaa'
type=<type 'str'>, x='U\xaa'

这允许您发送二进制数据。

票数 4
EN

Stack Overflow用户

发布于 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()

代码语言:javascript
复制
@QtCore.Slot(str)
def printdata(x):
    x = str(x)
    print "type=%s, x=%s" % (type(x), x.__repr__())

然而,正如你在问题中所说的,你有二进制数据,所以这是不起作用的。一种解决方案是告诉信号接受您自己的自定义类型:

代码语言:javascript
复制
class Thingy(QtCore.QObject):
    data = pyqtSignal(<your custom byte array type>)

然后,您可以创建自己的字节数组类型,它在幕后使用str (确保它是一个新的样式类)。

最后,您可以只使用QByteArray:

代码语言:javascript
复制
class Thingy(QtCore.QObject):
    data = pyqtSignal(QByteArray)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24620936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档