QComboBox中的QVariant(Python 2与Python 3)

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之前添加以下内容即可

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

但在实际代码中,我无法这样做(在其他地方, QVariant 需要api2)。

1个回答

2

您为什么一定要使用QVariant?

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

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

那么这段代码应该可以在 Python 2 和 3 中运行。

我自己不使用 Python 3,所以无法测试,但是这个修改在 Python 2.7 上运行良好。

编辑:

我很好奇,所以我在虚拟机中使用 Python 3.2 进行了测试。看起来 .itemData() 会返回一个字符串对象而不是 Python 3 中的 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的移植问题。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接