的QVariant在QComboBox(Python的2对的Python 3)(QVariant i

2019-09-16 21:04发布

我有一些代码(见下文)的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)。

Answer 1:

是否有任何理由为什么你必须使用的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移植的事情正确。



文章来源: QVariant in QComboBox (Python 2 vs Python 3)