首页 > 代码库 > Qt之模型/视图(委托)

Qt之模型/视图(委托)

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

# python:2.x

__author__ = ‘Administrator‘

from PyQt4.Qt import *

from PyQt4.QtGui import *

from PyQt4.QtCore import *

import sys,os

#视图和委托

"""

视图。在 model/view 架构中,视图是数据从模型到最终用户的途径。数据通过视图向用户进行显示。

此时,这种显示方式不必须同模型的存储结构相一致。实际上,很多情况下,数据的显示同底层数据的存储是完全不同的。

QAbstractItemModel提供标准的模型接口,使用 QAbstractItemView提供标准的视图接口,当结合这2个,可以对数据表示层分离,在视图中利用前面据说的模型索引,也可以来自模型的数据进行布局既可以直接渲染数据本身,也可以通过委托渲染和编辑数据。

视力不仅可以展示数据,还可以在数据项之间导航以及数据项选择,也需要支持很多基本用户界面的特性,比如:移动,编辑等,也可以把这些数据功能交给某个委托

视图可以脱离模型创建,但必须在显示之前存在,也就是说,视图显示完全基于模型的,这是不能脱离模型存在的,对于用户的选择,视图妈可以独立,也可以共享

-------

有些视图,比如QTableView和QTreeView,不仅显示数据,还会显示列头或者表头,通过QHeaderView视图类提供的实现,表头通常访问视图所包含的同一模型。它们使用QAbstractItemModel::headerData()函数从模型中获取数据,然后将其以标签 label 的形式显示出来。我们可以通过继承QHeaderView类,实现某些更特殊的功能。

 

"""

class SysTem(QWidget):

    def __init__(self,parent=None):#初始化

        super(SysTem,self).__init__(parent)#超类

        d=QStringList()

        d.append(‘0‘)

        d.append(‘1‘)

        d.append(‘2‘)

        m=QStringListModel(self)

        m.setStringList(d)

        listView=QListView()

        listView.setModel(m)

        btnshow=QPushButton(‘show‘,self)

        btnshow.clicked.connect(self.show)

        buttonLayout=QHBoxLayout()

        buttonLayout.addWidget(btnshow)

        layout=QVBoxLayout()

        layout.addWidget(listView)

        layout.addLayout(buttonLayout)

        self.setLayout(layout)

        a=SysTem1()

        #listView.setItemDelegate(SysTem1(listView))

#增加一个委托

class SysTem1(QStyledItemDelegate):

    def __init__(self,parent=None):

        self.createEditor()

        #self.setEditorData()

        #self.setModelData()

        #self.updateEditorGeometry()

    def createEditor(self,parent=None):#parent 参数会作为新的编辑器的父组件。

        editor=QSpinBox(parent)

        editor.setMinimum(0)

        editor.setMaximum(100)

        return editor

    def setEditorData(self,editor=None,index=None):#setEditorData()函数从模型中获取需要编辑的数据(具有Qt::EditRole角色)。由于我们知道它就是一个整型,因此可以放心地调用toInt()函数。editor 就是所生成的编辑器实例,我们将其强制转换成QSpinBox实例,设置其数据作为默认值。

        value=http://www.mamicode.com/index.model().date(index,Qt.EditRole).toInt()

        spinBox=editor

        spinBox.setValue(value)

    def setModelData(self,editor=None,model=None,index=None):

        spinBox=editor

        spinBox.interpretText()

        value=http://www.mamicode.com/spinBox.value()

        model.setData(index,value,Qt.EditRole)

    """

    委托会调用setModelData()函数将新的数据保存到模型中。因此,在这里我们首先获取QSpinBox实例,得到用户输入值,然后设置到模型相应的位置。标准的QStyledItemDelegate类会在完成编辑时发出closeEditor()信号,视图会保证编辑器已经关闭并且销毁,因此无需对内存进行管理。由于我们的处理很简单,无需在发出closeEditor()信号,但是在复杂的实现中,记得可以在这里发出这个信号。针对数据的任何操作都必须提交给QAbstractItemModel,

    这使得委托独立于特定的视图。当然,在真实应用中,我们需要检测用户的输入是否合法,是否能够存入模型。

    """

    def updateEditorGeometry(self,editor=None,index=None,option=None):

        editor.setGeometry(option.rect)

        """

        单将这个输入框的大小设置为单元格的大小(由option.rect提供)。如果是复杂的编辑器,我们需要根据单元格参数(由option提供)、数据(由index提供)结合编辑器(由editor提供)计算编辑器的显示位置和大小。

 

现在,我们的委托已经编写完毕。接下来需要将这个委托设置为QListView所使用的委托:"

        """

app=QApplication(sys.argv)

system=SysTem()

system.show()

sys.exit(app.exec_())

如图:

这边由于本人不懂(没有学过c++),所有地方请看到的朋友帮下,谢谢

原文是:http://www.devbean.net/2013/03/qt-study-road-2-view-delegate/

求帮c++的朋友帮下,谢谢