4

我有一些代码(见下文)在 Python 2 下按预期工作,但是当我在 Python 3 下执行它时,它会引发异常:

Traceback (most recent call last):
File "./test3.py", line 23, in <module>
programsCombo­Box.addItem("Jan Novak",QtCore­.QVariant("661107/39­39"))
TypeError: PyQt4.QtCore.QVa­riant represents a mapped type and cannot be instantiated

为什么会这样,有什么解决方法吗?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys

def activated(i):
    data=programsComboBox.itemData(i)
    label.setText("Rodne cislo: "+data.toString())

app = QtGui.QApplication(sys.argv)
mainWindow = QtGui.QMainWindow()
mainWindow.setWindowTitle("QVariant")
mainWidget=QtGui.QWidget(mainWindow)
mainWindow.setCentralWidget(mainWidget)
layout=QtGui.QVBoxLayout(mainWidget)

label=QtGui.QLabel("Rodne cislo: ",mainWidget)

programsComboBox=QtGui.QComboBox(mainWidget)
programsComboBox.addItem("Jan Novak",QtCore.QVariant("661107/3939"))
programsComboBox.addItem("Jakub Dvorak",QtCore.QVariant("750802/1278"))

layout.addWidget(programsComboBox)
layout.addWidget(label)

app.connect(programsComboBox,QtCore.SIGNAL("activated (int)"),activated)
mainWindow.show()
sys.exit(app.exec_())

更新:对于这个简单的代码,在第一个 PyQt4 导入之前添加这些就足够了

import sip
sip.setapi('QVariant', 1)

但是在真正的代码中我不能这样做(在不同的地方QVariant需要api2)。

4

1 回答 1

2

有什么理由必须使用 QVariant 吗?

如果您将项目添加为字符串:

programsComboBox.addItem("Jan Novak", "661107/3939")

那么代码应该在 Python 2 和 3 中工作。

我自己不使用 Python 3,因此无法对此进行测试,但修改在 Python 2.7 上运行良好。

编辑:

我很好奇,所以我在使用 Python 3.2 的 VM 中对此进行了测试。在 Python 3 中,它似乎.itemData()会返回一个字符串对象而不是 QVariant。

除了在上面添加项目时使用字符串之外,您还可以将activated函数修改为:

def activated(i):
    data=programsComboBox.itemData(i)
    if not isinstance(data, str):
        data = data.toString()
    label.setText("Rodne cislo: " +data)

以便它可以与 Python 2 和 3 一起使用。如果返回的.itemData()不是字符串,则该函数将使用.toString().

我不确定这是否是正确的方法,但它对我有用。我仍然需要正确研究整个 2 到 3 移植的事情。

于 2012-04-30T11:28:01.867 回答