PyQt:Python 2的新API

6 投票
3 回答
5346 浏览
提问于 2025-04-16 18:57

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

撰写回答