PyQt:Python 2的新API
PyQt有两个不同的接口:一个是旧的,一个是新的。
默认情况下,使用Python 2时会得到旧的接口,而使用Python 3时会得到新的接口。
那么,能不能在Python 2中启用新的PyQt接口呢?怎么做呢?
3 个回答
4
看看Riverbank网站上的“兼容性API” 链接
PyQt对多种不兼容的API提供了有限的支持,允许应用程序在运行时选择使用哪种API。例如,应用程序可以选择QString是作为Python类型来实现,还是自动转换为Python v2的unicode对象或Python v3的字符串对象。
这种能力让开发者可以决定如何管理从旧的、不再推荐使用的API过渡到新的、不兼容的API。
每个可以这样选择的API都有一个名字和一系列版本号。应用程序通过调用sip.setapi()来设置特定API的版本号。这个调用必须在导入任何实现该API的模块之前进行。一旦设置,版本号就不能再更改。如果没有设置,API将使用默认版本。
例如,下面的代码将禁用QString的使用:
import sip
sip.setapi('QString', 2)
from PyQt4 import QtCore
# This will raise an attribute exception because QString is only wrapped
# in version 1 of the API.
s = QtCore.QString()
目前实现的API有:
- QDate v1, v2
- QDateTime v1, v2
- QString v1, v2
- QTextStream v1, v2
- QTime v1, v2
- QUrl v1, v2
- QVariant v1, v2
13
来自这个reddit评论,
import sip
API_NAMES = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", "QUrl", "QVariant"]
API_VERSION = 2
for name in API_NAMES:
sip.setapi(name, API_VERSION)
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSvg import *
from PyQt4.QtCore import pyqtSignal as Signal
from PyQt4.QtCore import pyqtSlot as Slot
(...不过我建议用 from PyQt4 import QtCore
这样的方式,而不是 import *
)
9
也许你可以试试用 sip.setapi
。这里有一个文档里的简单例子:
import sip
sip.setapi('QString', 2)
还有一个支持的API列表:
QDate v1, v2
QDateTime v1, v2
QString v1, v2
QTextStream v1, v2
QTime v1, v2
QUrl v1, v2
QVariant v1, v2