3

、を使用するpythonpyside、次のエラーが発生します。

    self.setCheckState(value)
TypeError: could not convert 'BooleanEditor' to 'QCheckBox'

Googleの結果の多くは、「 could 」ではなく「TypeError: can not convert」しか表示しないことに加えて、これを修正する方法がまだわかりません。

コードスニペット:

class Editor(QGraphicsLayoutItem): 
    def __init__(self, name):
        QGraphicsLayoutItem.__init__(self)
        :
    :
    def update_value(self, value):
        pass

class BooleanEditor(Editor, QCheckBox):
    def __init__(self, parent, name, value, min, max):
        Editor.__init__(self, name)
        QCheckBox.__init__(self)

        self.update_value(value)

    def update_value(self, value):
        self.old_value = value
        self.setCheckState(value)  # Error occurs here. 

setCheckStateが受け取る「値」はQt.CheckStateになります。実行すると、Qt.Uncheckedデバッグ印刷によると、「値」は期待どおり(== 0)になります。

BooleanEditorを採用していることに注意してmultiple inheritanceください。私はwxWidget(他の誰かが作成した)アプリをに移植Qtしていますが、これは元のアプリからのものであるため、今のところこのデザインを変更したくありません(つまり、元のアプリは正常に動作するため、ここでのマルチ継承自体が原因ではないはずです)。

環境)pyside 1.1.0、python 2.7.3、Ubuntu 12.04


更新-1)@Luke Woodwardが示唆しているように、スーパークラスの順序をとして入れ替えようとしましたBooleanEditor(QCheckBox, Editor)が、別の部分で別のエラーが発生しました。

class PaneGroup(GroupView, QFrame):
    def __init__(self, parent, group, config, top = None):
        GroupView.__init__(self, group, top) 
        QFrame.__init__(self)
        :
        sizer = QGraphicsGridLayout()
        :        
        for param_descr in self.params:
            name = param_descr['name']
            type, val, min, max, description = param_descr['type'], config[name], param_descr['min'], param_descr['max'], param_descr['description']
            try:
                enum = eval(param_descr['edit_method'])['enum']
                editor = self.top.EnumEditor(self, name, val, enum)
            except:
                editor = self.top._editor_types[type](self, name, val, min, max)
            self.top.editors[name] = editor
            sizer.addItem(editor, row, 1) # Error occurs here

エラー:

TypeError: could not convert 'BooleanEditor' to 'QGraphicsLayoutItem'

私には多重継承の初期化に関する問題のように見えます。

4

1 に答える 1

0

PyQt4私の非常に悪い、それは私がの代わりに使用していたことが判明しましたPySide。を使用するPySideと、エラーは発生しませんが(@phihagの要点が示すように)、使用PyQt4すると同じ結果が得られます。実は不思議ですが、これ以上調べません。

次のコードを使用して複製します。

#!/usr/bin/env python    
import sys
from PySide.QtCore import Qt
from PySide.QtGui import QApplication, QCheckBox, QGraphicsLayoutItem
#from PyQt4.QtCore import Qt
#from PyQt4.QtGui import QApplication, QCheckBox, QGraphicsLayoutItem

class Editor(QGraphicsLayoutItem):
    def __init__(self, name):
        QGraphicsLayoutItem.__init__(self)
    def update_value(self, value):
        pass

class BooleanEditor(Editor, QCheckBox):
    def __init__(self, value):
        Editor.__init__(self, "foo")
        QCheckBox.__init__(self)

        self.update_value(value)

    def update_value(self, value):
        self.old_value = value
        self.setCheckState(value) # Error occurs here
        print("End of update_value")

if __name__ == "__main__":
    qApp = QApplication(sys.argv)
    BooleanEditor(Qt.Checked)

PS。使用していることを知らなかったのはなぜPyQtですか?私が使用しているフレームワークは、私が使用しているこのフレームワーク(Robot Operating Systemqt_guiと呼ばれます)に依存しています。これは、使用中のフレームワークを明示的に示していません(オープンソースのprjであり、ドキュメントの作業が進行中です)。 ...そのコードをハッキングした後、デフォルトはであることがわかりました。ROSPyQt

于 2012-09-13T02:32:42.817 に答える