# -*- 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=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=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++的朋友帮下,谢谢

Qt之模型/视图(委托)的更多相关文章

  1. 【转】Qt之模型/视图

    [本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html   作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...

  2. Qt之模型/视图(自定义风格)

    Qt之模型/视图(自定义风格) 关于自定义风格是针对视图与委托而言的,使用事件与QSS都可以进行处理,今天关于美化的细节讲解一下. 先看下图: 先撇开界面的美观性(萝卜青菜,各有所爱),就现有的这些风 ...

  3. PyQt5模型视图委托

    Model-View-Delegate 模型视图委托(MVD)是PyQt中特有的设计模式,类似MVC设计模式,将MVC设计模式中的Controller当做MVD中的Delegate,两者的概念基本相同 ...

  4. Qt 模型/视图/委托

    模型.视图.委托 模型/视图架构基于MVC设计模式发展而来.MVC中,模型(Model)用来表示数据:视图(View)是界面,用来显示数据:控制(Controller)定义界面对用户输入的反应方式. ...

  5. Qt之模型/视图(委托)

    概念 不同于模型 - 视图 - 控制器模式,模型/视图设计不包括用于管理与用户交互的一个完全独立的组件.一般情况,视图负责将模型数据呈现给用户以及处理用户输入.为了输入更加具有灵活性,则由委托来执行交 ...

  6. Qt之模型/视图(自定义进度条)

    简述 在之前的章节中分享过关于QHeaderView表头排序.添加复选框等内容,相信大家模型/视图.自定义风格有了一定的了解,下面我们来分享一个更常用的内容-自定义进度条. 实现方式: 从QAbstr ...

  7. Qt之模型/视图(实时更新数据)

    上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧! 在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!功能:(1)添加委托 ...

  8. QT MVC 模型/视图

    1. 模型视图实例一, QFileSystemModel  QTreeView ,model/view示例. #include <QApplication> #include <QF ...

  9. Qt MVC(模型-视图-代理)

    实习刚才是一段时间,公司这边就要求熟悉这个mvc.一般开始都是用tableview,前面的blog我都是使用listview居多,并且相对delegate这个使用的多余model.接下来说下model ...

随机推荐

  1. text-overflow简单使用

    text-overflow属性配合overflow才有效果,还记得把文字强制一行显示,如下代码: <!DOCTYPE html> <html lang="zh-cn&quo ...

  2. 绘制更Smooth的UI

    以前很长一段时间,在自定义控制绘制时,只是简单的定义一个QPainter对象而开始绘画.经常会画一些圆角矩形,甚至是一些不规则的图形.对于不规则的图形来说,如果PS技术不好,或者mask制作的不好,常 ...

  3. [转] iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)

    转自: 在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都 ...

  4. C#中的一些复习。

    摘自http://www.cnblogs.com/yuchengping/p/3151537.html 等日后自己来完善. 基本概念 1..NET是平台,C#是.NET上的一门语言. 2.C#的异常处 ...

  5. 一张图解析如何让img垂直居中对齐

    测试代码: <!DOCTYPE html> <html> <head> <style> .dd { background-color: gray; po ...

  6. MySQL 一些小知识

    1. 关于多表查询 我的理解:由于MySQL多表查询时表之间的连接是笛卡尔积的方式,所以尽量少使用多表查询,如果使用则使用嵌套语句 例:说明: `tb_notice_message` 表数量百万级别以 ...

  7. Web API零碎知识

    查看EF生成的sql的方法 1.通过在context中设置可以追踪EF[版本必须是6.0或以上]中生成的sql public BookServiceContext() : base("nam ...

  8. Android AsyncTask学习

    Android程序有UI进程和后台进程,在执行一些耗时的操作时,如果在UI进程中,很可能出现假死的情况,用户体验会受到影响,因此,那些耗时进程往往就放在了后台进程中,用户体验能更好一些.网络情况不稳定 ...

  9. Linux下MySql启动时报错

    /opt/mysql/support-files/mysql.server startmy_print_defaults: [ERROR] Found option without preceding ...

  10. html5响应式布局

    1.media控制布局 <link type="text/css" rel="stylesheet" href="css04.css" ...