我遇到Python 3.2和PyQt 4.8.6的问题 似乎Python 3.2无法找到导入。 特别是“Q”方法。例如下面的QString。
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
使用Python 2.7一切正常。 我的代码中的错误在哪里?
答案 0 :(得分:2)
查看notes about Python 3 in the PyQt Reference Guide。
QString类实现为映射类型 自动转换为Python字符串和从Python字符串转换。另外一个 None转换为null QString。但是,空QString是 转换为空的Python字符串(而不是None)。 (这是因为 Qt经常返回一个null QString,它应该返回一个 空QString。)
我还没有将任何代码移到Python 3上,但我相信这个想法是使用普通的Python字符串而不是QStrings。 PyQt将接受它们并且它们已经在Python 3中支持unicode。通常PyQt函数将返回QString,它将在Python 3下返回常规python字符串。
还要查看链接页面上的其他差异。
答案 1 :(得分:2)
Python3进行了许多不兼容的更改以“清理”语言,并且在某种程度上,PyQt通过引入某些API的“更多pythonic”版本来做同样的事情。但是,对于Python2 和 Python3,可以逐类选择这些不同的API版本,因此唯一真正的区别是为每个Python版本选择的默认值。
在Python2中,QString
的默认API版本是“v1”,它将其实现为Python类型;在Python3中,默认为“v2”,它自动转换为相应的Python字符串对象。
可以使用setapi
包中的sip
函数选择API版本。因此,要继续在应用程序中使用QString
类,只需确保在首次导入PyQt模块之前设置了适当的版本:
import sip
sip.setapi('QString', 1)
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
有关可以通过这种方式设置的所有API的详细信息,请参阅here。