我整天都在研究这个问题,尽管看了以下这样的事情:
http://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel
http://trevorius.com/scrapbook/uncategorized/pyqt-custom-abstractitemmodel/
http://blog.rburchell.com/2010/02/pyside-tutorial-model-view-programming_22.html
我完全被难过了。我要么甚至不能让这个例子工作,要么我可以,我无法弯腰做我想做的事。
基本上我想构建一个模型,我可以输入一个dicts列表。我的列表中的len()将是我的行,然后任何键的len()将是我的列数。
我对这些项目模型完全陌生(我通常使用TableWidget,ListWidget等及其内置实现),我不了解如何正确设置数据,使用beginInsertRows / endInsertRows添加行,以及即使我在ididnetally得到这个工作,试图弄清楚何时以及如何添加我的列总是会导致各种不好。
我想知道是否有人有任何我可以借鉴的例子 - 基于我所缺少的东西。例如: 给出
myList = [
{'name': 'John Smith', 'occupation': 'Police', 'Gender': 'Male'},
{'name': 'Jane Smith', 'occupation': 'CEO', 'Gender': 'Female'},
{'name': 'Ranoutta Ideas', 'occupation': 'Not Creativity', 'Gender': 'Male'},
]
我想将其插入到我的模型中并获得3行,每行包含3列,并且可能将键名称作为标题。
有人能指出我的好路吗? 提前谢谢!
修改
我在评论中尝试了一个例子:
导入系统 进口信号 导入PyQt4.QtCore为PCore 将PyQt4.QtGui导入为PGui
class OneRow(PCore.QObject):
def __init__(self):
self.column0="text in column 0"
self.column1="text in column 1"
class TableModel(PCore.QAbstractTableModel):
def __init__(self):
super(TableModel,self).__init__()
self.myList=[]
def addRow(self,rowObject):
row=len(self.myList)
self.beginInsertRows(PCore.QModelIndex(),row,row)
self.myList.append(rowObject)
self.endInsertRows()
#number of row
def rowCount(self,QModelIndex):
return len(self.myList)
#number of columns
def columnCount(self,QModelIndex):
return 2
#Define what do you print in the cells
def data(self,index,role):
row=index.row()
col=index.column()
if role==PCore.Qt.DisplayRole:
if col==0:
return str( self.myList[row].column0)
if col==1:
return str( self.myList[row].column1)
#Rename the columns
def headerData(self,section,orientation,role):
if role==PCore.Qt.DisplayRole:
if orientation==PCore.Qt.Horizontal:
if section==0:
return str("Column 1")
elif section==1:
return str("Column 2")
if __name__=='__main__':
PGui.QApplication.setStyle("plastique")
app=PGui.QApplication(sys.argv)
#Model
model=TableModel()
model.addRow(OneRow())
model.addRow(OneRow())
#View
win=PGui.QTableView()
win.setModel(model)
#to be able to close wth ctrl+c
signal.signal(signal.SIGINT, signal.SIG_DFL)
#to avoid warning when closing
win.setAttribute(PCore.Qt.WA_DeleteOnClose)
win.show()
sys.exit(app.exec_())
但是我最终得到了一个错误:
TypeError:TableModel.headerData()中的结果类型无效 TypeError:TableModel.data()
中的结果类型无效并且单元格中没有文字显示。我也没有标题标签。 如果我将其从返回的字符串更改为返回QVariant' s - 我在单元格/标题中获取文本,但仍然会获得大量的错误打印
编辑: 如果我让它退回以返回一个空的QVariant,不再打印错误 - 完全错过了。我打算玩这个设置,看看我是否可以按照我的需要让它工作,如果是这样的话,就把它贴在这里作为答案以防其他人遇到我的挣扎