2011-11-29 132 views
2

我有Python 3.2和PyQt 4.8.6的问题 好像Python 3.2无法找到导入。 尤其是“Q” - 方法。例如下面的QString。Python 3.2与Qt不兼容?

from PyQt4 import QtCore, QtGui 
try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 

与Python 2.7一切工作正常。 我的代码中的错误在哪里?

回答

2

为了“清理”语言,Python3做了许多不兼容的修改,并且在某种程度上,PyQt通过引入一些API的“更多pythonic”版本来做同样的事情。但是可以为Python2 Python3按类别选择这些不同的API版本,所以唯一真正的区别是为每个Python版本选择的默认值。

在Python2中,QString的默认API版本是“v1”,它将其实现为Python类型;在Python3中,默认值是“v2”,它会自动转换为适当的Python字符串对象以及从相应的Python字符串对象中转换。

可以使用sip软件包中的setapi函数来选择API版本。因此,要继续使用您的应用程序QString类,只要确保appropropriate版本为先进口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

2

看看notes about Python 3 in the PyQt Reference Guide

QString类实现为自动转换为Python字符串或从Python字符串转换为 的映射类型。另外一个 没有被转换为空的QString。但是,空QString是 转换为空的Python字符串(而不是无)。 (这是因为 Qt的经常返回一个空的QString时,它可能应该返回一个空 QString的。)

我没有过到Python 3已经搬了任何代码,但我相信这个想法是使用正常的Python字符串而不是QStrings。 PyQt将接受它们,并且它们已经支持Python 3中的unicode。通常,PyQt函数将返回一个QString,它将在Python 3下返回一个常规Python字符串。

查看链接页面上的其他差异。