我正在尝试使用自定义委托在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)
提前致谢!
答案 0 :(得分:1)
C ++文档的成员函数有一个大写&#39; F&#39;在&#39; ..为..&#39; setItemDelegateForColumn
的一部分。
我相当肯定在python版本中一定是你的问题。