QTableView 对象没有属性 'setItemDelegateforColumn'

QTableView object has no attribute 'setItemDelegateforColumn'

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

AttributeError: 'PySide.QtGui.QTableView' object has no attribute 'setItemDelegateforColumn'

我对 Python、Qt 和模型视图编程还很陌生,但我在另一个模块中拥有几乎相同的功能序列,并且可以完美运行。我熟悉 "object has no attribute errors",但我想知道标准(非自定义)对象中的某个属性是如何丢失的。

只是为了好玩,我尝试用 setItemDelegateforRow() 替换 setItemDelegateforColumn() 并得到相同的错误。有趣的是,我也尝试用 setItemDelegate() 替换它并得到一个充满复选框的 table - 这样就可以了。

我使用 Qt Designer 创建了一个具有多个选项卡 (QTabWidget) 的应用程序。在其中一个选项卡中,我有一个 table (QTableView)。 Qt Designer 创建的所有相关 UI 信息都在一个名为 lac_gui.py 的文件中。我的主程序调用一个函数,该函数 运行 使用 SQLAlchemy 进行查询,其中 returns 一个列表列表,将 table 中的行表示为 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

我为此 table 使用的模型如下 class:

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 在哪里被 subclass 编辑为其他东西(即便如此,如果我理解正确,它会保留原来的 methods/attributes,对吧)?

除了 names/references.

之外,其他模块中的代码几乎相同。

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

提前致谢!

C++ 文档在 setItemDelegateForColumn.

的 '..For..' 部分中具有大写 'F' 的成员函数

我很确定这一定是您在 python 版本中的问题。