TypeError:无法转换

时间:2012-09-12 19:50:59

标签: python pyside

使用pythonpyside,我收到此错误:

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

除了谷歌的许多结果只显示“TypeError:可以不转换”而不是“可以”,我仍然不知道如何解决这个问题。

代码段:

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接收的

“value”将为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'

看起来像是关于多重继承初始化的问题..

1 个答案:

答案 0 :(得分: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?对于我使用的那个,我依赖于我一直在使用的这个框架(在qt_gui中称为ROS, Robot Operating System),它没有明确告诉我哪个正在使用(它的开源prj)并且文档工作正在进行中)...在黑客入侵其代码后,我发现默认值为PyQt