`
tcspecial
  • 浏览: 911329 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

QT MVC模型

    博客分类:
  • QT
阅读更多

    QT项视图类主要有三种: QListView,QTreeView,QTableView,对应的基础Model为 QAbstractItemModel(QStandardItemModelo为QAbstractItemModel实现), 对于QListView和QTableView则分别提供了QStringListModel,QAbstractTableModel实现. 

   一直不太喜欢用MVC模型,对于很简单的视图,使用MVC反而显得有点复杂,大材小用了. QT中对于QListView,QTreeView,QTableView这三个视图提供了其简便实现类QListWidget,QTreeWidget,QTableWidget. 如果处理比较复杂且数据量比较大的视图,MVC就显现出其优越性了,下面看例子:

 

   history table view

 

一. QTableWidget实现

QTableWidget tableWidget;
tableWidget.setAlternatingRowColors(true);
tableWidget.setWindowTitle("历史曲线");

// 设置水平/垂直方向标签
tableWidget.setColumnCount(2);
tableWidget.setRowCount(2);
tableWidget.setHorizontalHeaderLabels(QStringList()<<"0分钟"<<"5分钟");
tableWidget.setVerticalHeaderLabels(QStringList()<<"0小时"<<"1小时");

// 填充数据
for(int i=0;i<2;i++) // 行
{
	for(int j=0;j<2;j++) // 列
	{
		QTableWidgetItem *item=new QTableWidgetItem;
		item->setText(QString::number(datas[i*2+j]));

		tableWidget.setItem(i,j,item);
	}
}

tableWidget.show();

   QTableWidget构建表格,需要手动一个一个添加数据,视图与数据层深度耦合

 

二. QListView+QStandardItemModel实现

// 标准model实现
QStandardItemModel hisModel(2,2); // 定义2行2列模型
hisModel.setHorizontalHeaderLabels(QStringList()<<"0分钟"<<"5分钟");
hisModel.setVerticalHeaderLabels(QStringList()<<"0小时"<<"1小时");
for(int i=0;i<2;i++) // 行
{
	for(int j=0;j<2;j++) // 列
	{
		QStandardItem *item=new QStandardItem;
		item->setText(QString::number(datas[i*2+j]));

		hisModel.setItem(i,j,item); // model设置数据
	}
}

QTableView tableView;
tableView.setModel(&hisModel); // 只需要设置model就行了,将数据渲染工作交给model
tableView.setAlternatingRowColors(true);
tableView.setWindowTitle("历史曲线");
tableView.show();

   将数据渲染逻辑交给model, view层只需调用setModel()即可显示数据,

 

三.  QListView+QAbstractTableModel实现

       对于上述代码,当数据修改后,不能即时在view上显现出来,代码比较固化. 下面通过实现QAbstractTableModel来实现:

project List   

 

main.cpp

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
	QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

    QList<double> datas;
    datas<<89.2<<98.3<<45.8<<65.9;

    HistoryModel hisModel;
    hisModel.setHisDatas(datas); // 当数据改变后,只需要重新调用setHisDatas()就可以更改视图

    QTableView tableView;
    tableView.setModel(&hisModel);
    tableView.setAlternatingRowColors(true);
    tableView.setWindowTitle("历史曲线");
    tableView.show();
	
    return app.exec();
}	

historymodel.h

/**
 * 派生QAbstractTableModel
 */ 
class HistoryModel:public QAbstractTableModel
{
    Q_OBJECT

public:
    HistoryModel(QObject *parent=0);
	~HistoryModel();

	// 重载,返回行数目
    int rowCount(const QModelIndex &parent) const;
	// 重载,返回列数目
    int columnCount(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;

	// 设置模型数据源
    void setHisDatas(const QList<double> hisdatas);

private:
    QStringList horizontalList;
    QStringList verticalList;
    QList<double> hisdatas;
};

 

historymodel.cpp

#include "historymodel.h"

HistoryModel::HistoryModel(QObject *parent):QAbstractTableModel(parent)
{
	horizontalList<<"0分钟"<<"5分钟";
	verticalList<<"0小时"<<"1小时";
}

HistoryModel::~HistoryModel()
{

}

void HistoryModel::setHisDatas(const QList<double> hisdatas)
{
	this->hisdatas=hisdatas;

	// 调用reset()告诉任何一个使用这个模型的视图,它们所有的数据都无效了,这样就会强制它们为可见的项刷新数据
	reset();
}

int HistoryModel::rowCount(const QModelIndex &parent) const
{
	return verticalList.size();
}


int HistoryModel::columnCount(const QModelIndex &parent) const
{
	return horizontalList.size();
}

QVariant HistoryModel::headerData(int section, Qt::Orientation orientation, int role) const
{
	if(role==Qt::DisplayRole)
	{
		if(orientation==Qt::Horizontal) // 水平表头
		{
			return horizontalList[section];
		}

		return verticalList[section]; // 垂直表头
	}

	return QVariant();
}

Qt::ItemFlags HistoryModel::flags(const QModelIndex &index) const
{
	Qt::ItemFlags flag=QAbstractItemModel::flags(index);
	
	// flag|=Qt::ItemIsEditable // 设置单元格可编辑,此处注释,单元格无法被编辑
	return flag;
}

QVariant HistoryModel::data(const QModelIndex &index, int role) const
{
	if(!index.isValid())
		return QVariant();

	if(role==Qt::TextAlignmentRole)
	{
		return int(Qt::AlignHCenter|Qt::AlignVCenter); // 设置单元格对齐方式
	}else if(role==Qt::DisplayRole)
	{
		int offset=index.row()*horizontalList.size()+index.column(); // 设置单元格数据
		return hisdatas[offset];
	}

	return QVariant();
}

   通过子类化QAbstractTableModel,重新实现模型内虚方法,设置项的显示方式,项数据. 

 

 疑问: 如何设置第一个表头数据,见下面效果:

 Set Table Header

 

  • 大小: 13.8 KB
  • 大小: 12.1 KB
  • 大小: 17.2 KB
分享到:
评论

相关推荐

    Qt MVC模型视图代码标准模板

    本篇文章将详细探讨Qt MVC模型视图代码的标准模板,并结合SQLite数据库进行实例解析。 首先,我们从MVC的三个主要组件开始: 1. **模型(Model)**:模型是应用程序的核心,负责管理和处理数据。在Qt中,...

    Qt之MVC模型视图的使用入门

    在"Qt之MVC模型视图的使用入门"中,你可能学习到如何创建和操作模型,比如如何添加、删除数据,以及如何发送信号通知视图。同时,你会接触到视图的使用,如设置视图的布局,连接模型,并响应模型的改变进行更新。...

    Qt使用mvc架构进行编程

    Qt通过信号和槽机制增强了MVC架构,使得模型和视图之间的通信更为简洁。当模型数据发生变化时,它会发出信号,视图通过连接这些信号并响应槽函数来更新自身。`QAbstractItemModel`提供了一套接口,用于定义模型的...

    modelview.rar_QT_modelview_mvc_qt mvc_qt MVC

    在QT框架中,Model-View-Controller(MVC)是一种常用的设计模式,它将应用程序的数据、用户界面和逻辑控制分离开来,使得代码更易于维护和扩展。`modelview.rar`这个压缩包文件可能包含了关于如何在QT环境中实现MVC...

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

    在"Qt之模型/视图(实时更新数据)"的场景中,我们主要关注如何在Qt环境中实现一个MVC(Model-View-Controller)程序,以实现实时更新数据的功能。 首先,模型(Model)是数据的核心,它负责存储和管理数据。在这个...

    Qt使用MVC、数据库单例模式实现登录注册

    在本文中,我们将深入探讨如何使用Qt框架,结合MVC(Model-View-Controller)设计模式、SQLite3数据库以及单例模式来实现一个高效的登录注册系统。Qt是一个跨平台的应用程序开发框架,广泛用于GUI(图形用户界面)...

    Qt5实现的一个mvc的例子

    libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View&lt;====&gt;Front Controller&lt;====&gt;Commands&lt;====&gt;Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...

    Qt MVC 主要代码.zip

    QtMVC(Model-View-Controller)是一种设计模式,常用于构建复杂且可维护的用户界面。在Qt中,MVC模式被用来分离数据模型、视图和控制器,以实现更好的代码组织和重用。现在,我们将深入探讨这些文件所代表的Qt MVC...

    基于Qt的C++架构实例(模型MVC在C++后端管理系统应用)

    本资源是一个完整的Qt5.9Creator工程代码,主要功能是总结一个Qt下的MVC架构。该架构主要分为控制层、UI界面层、模型层,具体的理论讲解,可以参考博主这篇博客: ...

    Qt实现MVC源码

    libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View&lt;====&gt;Front Controller&lt;====&gt;Commands&lt;====&gt;Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...

    QT_MVC.zip_MVC QT_qt MVC_site:www.pudn.com

    压缩包内的"QT_MVC.docx"文件可能是详细教程或示例代码,它可能包含了如何在Qt中实现MVC模式的步骤,包括模型类的创建、视图类的设置、委托的使用以及信号和槽的连接等内容。如果你希望深入理解Qt中的MVC模式,这个...

    Qt之mvc模式——QHeadView详解已经应用

    它取代了Qt3的QHeader类,QHeader类以前用于相同的目的,但是为了与item视图类保持一致,它使用了Qt的模型/视图体系结构。 QHeaderView类是模型/视图类之一,是Qt模型/视图框架的一部分。 header使用...

    TestProject_qtmvc_QT_frequently24u_

    在本文中,我们将深入探讨`TestProject_qtmvc_QT_frequently24u_`这一项目,它展示了如何使用Qt库实现一个简单的Model-View-Controller(MVC)设计模式。Qt是一个流行的C++跨平台应用程序开发框架,广泛应用于桌面、...

    Qt5实现的一个mvc 的例子

    在提供的"qt_mvc"压缩包中,可能包含了实现这个MVC示例的源代码,包括模型类、视图设置以及控制器逻辑。通过阅读和理解这些代码,你可以更深入地了解Qt5中如何应用MVC模式。 总结来说,Qt5提供了一套强大的工具来...

    qt版本pureMVC

    Qt版本的PureMVC是一个基于设计模式的框架,主要用于构建可维护性和可扩展性极高的应用程序。这个框架的实现是将经典的MVC(Model-View-Controller)模式应用于Qt编程环境,为Qt开发者提供了一种结构化的方法来组织...

    MVC模型视图的模型在实际工程的应用.rar

    该例子使用了Qt的MVC编程,实现了把数据从txt文档中解析出数据,将解析后的数据存入到QStandardItem对象中;然后别存入到表格视图的Model和数据映射窗口器的Model中;在QStandardItemModel对象中组织显示数据项,...

    基于PureMVC框架实现的Qt的一个例子

    PureMVC是一种轻量级、模型-视图-控制器(MVC)框架,最初是为ActionScript开发的,后来被移植到多种编程语言中,包括C++。它提供了一种组织代码结构的方式,使得开发者可以更高效地构建可维护和可扩展的软件应用。 ...

Global site tag (gtag.js) - Google Analytics