QTableView对象没有属性'setItemDelegateforColumn'

时间:2015-11-09 19:56:13

标签: python qt delegates pyside qtableview

我正在尝试使用自定义委托在QTableView的每一行的第一列中设置一个复选框。每当程序运行时,我都会收到以下错误:

  

AttributeError:'PySide.QtGui.QTableView'对象没有属性'setItemDelegateforColumn'

我是Python,Qt和模型视图编程的新手,但我在一个完美无缺的模块中有一个几乎相同的函数序列。我熟悉“对象没有属性错误”,但我是关于如何从标准(非自定义)对象中删除属性。

我只是尝试使用setItemDelegateforRow()替换setItemDelegateforColumn()并获得相同的错误。有趣的是,我也尝试用setItemDelegate()替换它,并获得一整个复选框 - 这样就行了。

我使用Qt Designer创建了一个包含多个标签的应用程序(QTabWidget)。在其中一个标签中,我有一个表(QTableView)。 Qt Designer创建的所有相关UI信息都位于名为lac_gui.py的文件中。我的主程序调用一个使用SQLAlchemy运行查询的函数,该函数返回表示表中行为self.notes_data的列表列表。运行查询后,将调用以下代码:

def create_notes_table(self):

    #self.tableView_noteslist = QtGui.QTableView(self)  <-- also tried setting directly as a QTableView object to make sure it wasn't being overridden something else.  Same error.
    self.model_notes = NotesTableModel(self, self.notes_data, self.notes_header)
    self.checkbox_delegate = CheckBoxDelegate(self)
    self.tableView_noteslist.setModel(self.model_notes)
    self.tableView_noteslist.setItemDelegateforColumn(0, self.checkbox_delegate)
    return self.tableView_noteslist

我用于此表的模型位于以下类中:

class NotesTableModel(QtCore.QAbstractTableModel):

    def __init__(self, parent, notes_data, notes_header, *args):
        QtCore.QAbstractTableModel.__init__(self, parent, *args)
        self.notes_data = notes_data
        self.notes_header = notes_header

    def rowCount(self, parent):
        return len(self.notes_data)

    def columnCount(self, parent):
        if len(self.notes_data) > 0:
            return len(self.notes_data[0])
        else: 
            return 0

    def data(self, index, role):
        if not index.isValid():
            return None
        elif role == QtCore.Qt.TextAlignmentRole:
            return QtCore.Qt.AlignLeft
        elif role != QtCore.Qt.DisplayRole:
            return None
        else:
            return self.notes_data[index.row()][index.column()]

    def headerData(self, col, orientation, role):
        if role == QtCore.Qt.TextAlignmentRole:
            return QtCore.Qt.AlignLeft
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self.notes_header[col]
        return None

    def sort(self, col, order):
        self.emit(QtCore.SIGNAL("layoutAboutToBeChanged()"))
        self.notes_data = sorted(self.notes_data,
            key=operator.itemgetter(col))
        if order == QtCore.Qt.DescendingOrder:
            self.notes_data.reverse()
        self.emit(QtCore.SIGNAL("layoutChanged()"))

    def flags(self, index):
        if index.column() == 0:
            return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
        else:
            return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

    def setData(self, index, new_value, role):
        if not index.isValid():
            return None
        elif role != QtCore.Qt.EditRole:
            return None

        return self.notes_data[index.row()][index.column()]

lac_gui.py(来自Qt Designer)的相关文章:

self.tab_notes = QtGui.QWidget()
self.tab_notes.setObjectName("tab_notes")
self.tableView_noteslist = QtGui.QTableView(self.tab_notes)

我无法看到QTableView被子类化为其他东西(即便如此,如果我理解正确,它会保留原始方法/属性,对吧)?

除名称/引用外,其他模块中的代码几乎完全相同。

(FWIW - Python 3.4,Qt 4.8.5,Pyside 1.2.2)

提前致谢!

1 个答案:

答案 0 :(得分:1)

C ++文档的成员函数有一个大写&#39; F&#39;在&#39; ..为..&#39; setItemDelegateForColumn的一部分。

我相当肯定在python版本中一定是你的问题。