首页 > 代码库 > qt model/view 架构自定义模型之QStringListModel

qt model/view 架构自定义模型之QStringListModel

# -*- coding: utf-8 -*-

# python:2.x

#QStringListModel

#QStringListModel 是最简单的模型类,具备向视图提供字符串数据的能力。

#QStringListModel 是一个可编辑的模型,可以为组件提供一系列字符串作为数据。

#看作是封装了 QStringList 的模型。QStringList 是一种很常用的数据类型,实际上

#是一个字符串列表(也就是 QList<QString>)。既然是列表,它也就是线性的数据结构,

#因此, QStringListModel 很多时候都会作为 QListView 或者 QComboBox 这种只有一列

#的视图组件的数据模型。

__author__ = ‘Administrator‘

from PyQt4.QtGui import  *

from PyQt4.Qt import *

from PyQt4 import QtGui, QtCore

from PyQt4.QtCore import *

import sys

class Painterd(QWidget):

    def __init__(self):

        super(Painterd,self).__init__()

        self.setFixedSize(300,200)

        self.vector()

    def vector(self):

        tablewidtet=QStringList()

        tablewidtet.append(‘a‘)

        tablewidtet.append(‘b‘)

        tablewidtet.append(‘c‘)

        tablewidtet.append(‘d‘)

        self.model=QStringListModel(self)

        self.listView=QListView(self)

        self.model.setStringList(tablewidtet)

        self.listView.setModel(self.model)

        btnLayout=QHBoxLayout()

        insertBtn=QPushButton(‘insert‘,self)

        dels=QPushButton(‘delete‘,self)

        showbto=QPushButton(‘show‘,self)

        btnLayout.addWidget(insertBtn)

        btnLayout.addWidget(dels)

        btnLayout.addWidget(showbto)

        mainlayout=QVBoxLayout(self)

        mainlayout.addWidget(self.listView)

        mainlayout.addLayout(btnLayout)

        self.setLayout(mainlayout)

        insertBtn.clicked.connect(self.inpits)

        dels.clicked.connect(self.dels1)

        showbto.clicked.connect(self.edits)

    def edits(self):#直接按F2就可以编辑,不用自己实再实现编辑功能

        row=self.listView.currentIndex().row()

        index=self.model.index(row)

        variant=self.model.data(index,Qt.DisplayRole)#获取当前选择项文本

        text=variant.toString()

        ok,text=QInputDialog.getText(self,u‘输入‘,u‘请输入内容?‘,QLineEdit.Normal,text)#要求用户输入数据

        #解释这部分代码:

        #首先插入空行,然后选中新插入的空行,设置新的

        # 数据。这其实是一种冗余操作,因为 currentIndex()已经获取到当前行。

        if ok:

            row=self.listView.currentIndex().row()#获取 Q ListView 当前行的项

            self.model.insertRows(row,1)

            """

            QStringListModel 的

一个重载。参数  1  说明要插入  1  条数据。记得之前我们已经把  row  设置为当前行,因此,

这行语句实际上是在当前的  row  位置插入  count  行,这里的  count  为  1。由于我们没有添

加任何数据,实际效果是,我们在  row  位置插入了  1  个空行。然后我们使用  model  的

index()函数获取当前行的 QModelIndex 对象,利用 setData()函数把我们用 QInputDialog

接受的数据设置为当前行数据。接下来,我们使用 setCurrentIndex()函数,把当前行设为

新插入的一行,并调用 edit()函数,使这一行可以被编辑。

            """

            index=self.model.index(row)#QModelIndex类是用于定位数据的数据模型:三个重要的数据:行索引、列索引以及该数据属于哪一个模型,调用其 row()函数获得行索引,该返回值是一个  int,也就是当前是第几行

            #bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());

            #count行插入到模型给定的row位置,新行的数据将会作为parent子元素,如果row是0,新行将被插入到parent所有数据之前,否则将在指定的位置数据之前,如果

            #parent没有子元素,则会新插入一个单列数据,函数 插入返回成功True,否则False,

            self.model.setData(index,text)

            self.listView.setCurrentIndex(index)

    def dels1(self):

        self.model.removeRows(self.listView.currentIndex().row(),1)

    def inpits(self):

        ok,text=QInputDialog.getText(self,u‘输入‘,u‘请输入内容?‘,QLineEdit.Normal,‘‘)

        if ok:

            row=self.listView.currentIndex().row()

            self.model.insertRows(row,1)

            index=self.model.index(row)

            self.model.setData(index,text)

            self.listView.setCurrentIndex(index)

 

 

def main():

    app = QtGui.QApplication(sys.argv)

    ex =Painterd()

    ex.show()

    sys.exit(app.exec_())

if __name__ == ‘__main__‘:

    main()

如图:

#例子原地址:http://www.cnblogs.com/venow/archive/2012/10/17/2728299.html