PySide / PyQt QAbstractItemModel问题

时间:2015-12-02 01:19:03

标签: pyqt pyside qtableview qabstractitemmodel

我整天都在研究这个问题,尽管看了以下这样的事情:

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,不再打印错误 - 完全错过了。我打算玩这个设置,看看我是否可以按照我的需要让它工作,如果是这样的话,就把它贴在这里作为答案以防其他人遇到我的挣扎

0 个答案:

没有答案