Python 3.2和Qt之间不兼容?

时间:2011-11-29 08:50:21

标签: python-3.x pyqt pyqt4 compatibility

我遇到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一切正常。 我的代码中的错误在哪里?

2 个答案:

答案 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