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")

その場合、コードはPython2および3で機能するはずです。

私はPython3を自分で使用していないので、これをテストすることはできませんが、変更はPython2.7で正常に実行されます。

編集:

興味があったので、Python3.2を使用してVMでこれをテストしました。.itemData()Python3では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 に答える