qt mvc1
mvc是经典的三层结构,将数据,视图和逻辑分离。Qt中的Model/View框架,实现了这个模式。在Qt中这个模式设计到三个类,model类,view类和delegate类。model类保存数据,view复制显示,而delegate负责协调model和view之间的数据edit(编辑)和render(渲染)。
这些在model子类中需要实现的方法可以分为三组。
项数据绑定:所有的model需要实现方法使视图和代理能够查询model...
Models能够提供各种程度的数据访问限制:read-only,resizing,edited
Read-Only access 只读访问
如果只读访问,只需要实现下面几个函数在继承的子类中
Flags,其他的组件可以通过这个得知每个Item的信息,在大多数的models中,包含Qt::ItemIsEnable,Qt::ItemIsSelectable
data,被用来提供数据给视图和代理,一般的,models只要提供Qt::DisplayRole和任何程序特殊的角色,也有一些特殊的Qt::ToolTipRole等,详细可以看Qt::ItemDataRole。
headerData,为视图的头部提供信息数据。
rowCount提供这个model有多少行数据。
上述的四个函数在任何类型的model中都要实现,不管是QAbstractListModel还是QAbstractTableModel。另外,下面的函数必须被实现,在QAbstractTableModel和QAbstractItemModel中,columnCount。
编辑项目
可编辑的模型允许数据项被修改,和可以提供函数来插入数据在行和列。
Flags,必须包含Qt::ItemDataRole。
setData,被用来修改和特殊的模型索引相关的项目。修改的数据必须是Qt::EditRole,发送一个dataChanged信号。
setHeaderData,用来修改水平和垂直的头信息,发出一个headerDataChanged信号。
改变models的size
所有类型的model能够提供插入和移除行。Table Model和分级的model也支持列的插入和删除操作。
下面的例子是基于QAbstractListModel实现的一个QStringListModel
[cpp] view plaincopyprint?
/************************************************ 
* 
*author:周翔 
*e-mail:604487178@qq.com 
*blog:http://blog.csdn.net/zhx6044 
* 
* 
*************************************************/
#ifndef STRINGLISTMODEL_HPP  
#define STRINGLISTMODEL_HPP
#include <QAbstractListModel>  
#include <QStringList>
class StringListModel : public QAbstractListModel  
{  
    Q_OBJECT  
public:  
    explicit StringListModel( const QStringList &stringList, QObject *parent = 0);  
    //重新实现的函数  
    int rowCount(const QModelIndex &parent) const;  
    QVariant data(const QModelIndex &index, int role) const;  
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;  
    Qt::ItemFlags flags(const QModelIndex &index) const;  
    bool setData(const QModelIndex &index, const QVariant &value, int role);  
signals:
public slots:  
private:  
    QStringList m_slist;//存放数据的容器
};
#endif // STRINGLISTMODEL_HPP
/************************************************ 
* 
*author:周翔 
*e-mail:604487178@qq.com 
*blog:http://blog.csdn.net/zhx6044 
* 
* 
*************************************************/
#include "stringlistmodel.hpp"  
#include <QDebug>
StringListModel::StringListModel(const QStringList &stringList, QObject *parent) :  
    QAbstractListModel(parent),  
    m_slist(stringList)  
{  
}  
/** 
 * @brief StringListModel::rowCount model数据的行数 
 * @return  
 */  
int StringListModel::rowCount(const QModelIndex &/*parent*/) const  
{  
    return m_slist.length();//就是链表的长度  
}  
/** 
 * @brief StringListModel::data 获得对应index项的数据 
 * @param index 
 * @param role 数据的角色 
 * @return  
 */  
QVariant StringListModel::data(const QModelIndex &index, int role) const  
{  
    if (!index.isValid()) {  
        return QVariant();  
    }  
    //row从0开始,有效的范围为0~链表长度减1  
    if (index.row() >= m_slist.length()) {  
        return QVariant();  
    }  
    if (role == Qt::DisplayRole) {  
        return m_slist.at(index.row());  
    } else {  
        return QVariant();  
    }  
}
QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const  
{  
    if (role != Qt::DisplayRole) {  
        return QVariant();  
    }  
    if (orientation == Qt::Horizontal) {  
        return QString("col %1").arg(section);  
    } else {  
        return QString("row %1").arg(section);  
    }  
}  
/** 
 * @brief StringListModel::flags 被其他组件访问时获得每个Item的信息 
 * @param index 
 * @return  
 */  
Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const  
{  
    if (!index.isValid()) {  
        return Qt::ItemIsEnabled;  
    }  
    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;//可编辑的  
}  
/** 
 * @brief StringListModel::setData 当视图的显示的数据被改变的时候,model也相应的改变 
 * @param index 
 * @param value 
 * @param role 
 * @return  
 */  
bool StringListModel::setData(const QModelIndex &index, const QVariant &value, int role)  
{  
    //这个index必须是有效的,必须还是可编辑的  
    if (index.isValid() && role == Qt::EditRole) {  
        m_slist.replace(index.row(),value.toString());  
        emit dataChanged(index,index);//发出这个信号,外部使用这个信号没用  
        return true;  
    }  
    return false;
}
使用这个model类
[cpp] view plaincopyprint?
StringListModel *model = new StringListModel(QStringList() << "chenchen"  
                                                 << "love"  
                                                 << "zhou xiang",this);  
    ui->listView->setModel(model);  
    //这边的listView是一个QListView对象
qt mvc1的更多相关文章
- QT内省机制、自定义Model、数据库
		
本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...
 - Ubuntu 下安装QT
		
Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...
 - Qt安装配置
		
Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...
 - Qt信号与槽自动关联机制
		
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
 - 保持Qt GUI响应的几种方法
		
最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...
 - Qt 中使用Singleton模式需小心
		
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
 - Qt——组件位置随窗口变化
		
当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...
 - (转) Qt 出现“undefined reference to `vtable for”原因总结
		
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...
 - qt中ui的 使用介绍
		
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
 
随机推荐
- 交付Dubbo微服务到kubernetes集群
			
1.基础架构 1.1.架构图 Zookeeper是Dubbo微服务集群的注册中心 它的高可用机制和k8s的etcd集群一致 java编写,需要jdk环境 1.2.节点规划 主机名 角色 ip hdss ...
 - Codeforces Round #609 (Div. 2) C. Long Beautiful Integer
			
链接: https://codeforces.com/contest/1269/problem/C 题意: You are given an integer x of n digits a1,a2,- ...
 - Matplotlib模块的基本使用
			
一.折线绘图 import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv("F:\\ml\\机器学习\\01 ...
 - Django后台中文乱码
			
无论如何,刚开始一定要写上默认编码utf8!!!!!! 第一种办法: 检查 ...\Lib\site-packages\Django-1.10.2-py2.7.egg\django\conf\loca ...
 - bootstrap之collapse
			
<div class="container"> <!--该button可以控制div是否显示 1.首先给button设置data-toggle="col ...
 - 33、[源码]-AOP原理-获取拦截器链-MethodInterceptor
			
33.[源码]-AOP原理-获取拦截器链-MethodInterceptor
 - [Angular 8] Lazy loading with dynamic loading syntax
			
@NgModule({ declarations: [AppComponent, HomeComponent], imports: [ BrowserModule, MatSidenavModule, ...
 - spark操作hive方式(scala)
			
第一种方式: def operatorHive: Unit = { Class.forName("org.apache.hive.jdbc.HiveDriver") val url ...
 - spring security控制session
			
spring security控制session本文给你描述在spring security中如何控制http session.包括session超时.启用并发session以及其他高级安全配置. 创 ...
 - 073_使用 shell 脚本打印如下图形
			
#!/bin/bash #打印第一组图片#for(())为类 C 语言的语法格式,也可以使用 for i in;do;done 的格式替换#for((i=1;i<=9;i++))循环会执行 9 ...