我有一些代码(见下文)在
Python 2下按预期工作,但是当我在Python 3下执行它时会引发异常:
Traceback (most recent call last):
File "./test3.py", line 23, in <module>
programsComboBox.addItem("Jan Novak",QtCore.QVariant("661107/3939"))
TypeError: PyQt4.QtCore.QVariant 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).
最佳答案 你有什么理由要使用QVariant吗?
如果您将项目添加为字符串:
programsComboBox.addItem("Jan Novak", "661107/3939")
然后代码应该在Python 2和3中工作.
我自己不使用Python 3,因此无法对此进行测试,但修改在Python 2.7上运行良好.
编辑:
我很好奇,所以我在使用Python 3.2的VM中测试了这个.似乎.itemData()将返回一个字符串对象而不是Python 3中的QVariant.
除了在上面添加项目时使用字符串,您还可以将激活的函数修改为:
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的移植事物.