首页 > 代码库 > 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