首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解QAbstractTableModel中的MVC

理解QAbstractTableModel中的MVC
EN

Stack Overflow用户
提问于 2015-06-10 15:48:39
回答 1查看 478关注 0票数 0

我有一些由我自己的类表示的数据,为了解决这些问题,我给出了一个例子。

代码语言:javascript
复制
class MyOwnModel():
  def __init__(self, name="", number=0):
    self.name = name
    self.number = number

然后,我有了这样一个实例的列表,我想在QTableView中表示这些实例。

代码语言:javascript
复制
li = [MyOwnModel("a", 1), MyOwnModel("b", 2)]

然后,我看到了两种策略,通过这两种策略来制作QTableView

  1. 更改MyOwnModel,使其子类为QAbstractTableModel
  2. 构建一个新的QAbstractTableModel,它以其属性为两个QString的方式模仿MyOwnModel,并将dataChanged信号连接到一个更新MyOwnModel实例的函数

我对所有这些都不完全满意,但我暂时没有其他的想法。

哪一个最适合我的问题?(我在实践中有一个更复杂的类,但我想使用相同的框架)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-11 09:03:23

正如注释中所述,您的模型是您的对象列表。您应该用子类QAbstractTableModel来使用这个列表。

下面是我的代码片段:

代码语言:javascript
复制
import sys
import signal
import PyQt4.QtCore as PCore
import PyQt4.QtGui as 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_())

myList的每个元素都是表中的一行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30761249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档