QT项视图类主要有三种: QListView,QTreeView,QTableView,对应的基础Model为 QAbstractItemModel(QStandardItemModelo为QAbstractItemModel实现), 对于QListView和QTableView则分别提供了QStringListModel,QAbstractTableModel实现.
一直不太喜欢用MVC模型,对于很简单的视图,使用MVC反而显得有点复杂,大材小用了. QT中对于QListView,QTreeView,QTableView这三个视图提供了其简便实现类QListWidget,QTreeWidget,QTableWidget. 如果处理比较复杂且数据量比较大的视图,MVC就显现出其优越性了,下面看例子:
一. 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来实现:
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,重新实现模型内虚方法,设置项的显示方式,项数据.
疑问: 如何设置第一个表头数据,见下面效果:
相关推荐
Qt MVC模型视图代码标准模板
Qt之MVC模型视图的使用入门
libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View<====>Front Controller<====>Commands<====>Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...
它取代了Qt3的QHeader类,QHeader类以前用于相同的目的,但是为了与item视图类保持一致,它使用了Qt的模型/视图体系结构。 QHeaderView类是模型/视图类之一,是Qt模型/视图框架的一部分。 header使用...
libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View<====>Front Controller<====>Commands<====>Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...
Qt使用MVC框架、sqlite3数据库、单例模式实现登录注册功能
本资源是一个完整的Qt5.9Creator工程代码,主要功能是总结一个Qt下的MVC架构。该架构主要分为控制层、UI界面层、模型层,具体的理论讲解,可以参考博主这篇博客: ...
qt开发 视图-模型-控制经典实例,主要通过介绍几种典型案例来学习MVC结构
qt实现简单的mvc模型,以及简单的逻辑说明。
该例子使用了Qt的MVC编程,实现了把数据从txt文档中解析出数据,将解析后的数据存入到QStandardItem对象中;然后别存入到表格视图的Model和数据映射窗口器的Model中;在QStandardItemModel对象中组织显示数据项,...
Qt实现的MVC编程 功能: (1)添加委托(进度条) (2)显示文件名称、大小、进度、速度、剩余时间、状态等。 (3)可进行添加、更新、删除、清空等操作。 (4)实时更新数据
使用多个视图到同一个模型时,通常需要所有的模型数据和用户的选择在所有视图显示一致。由于视图类允许其内部选择模型进行更换,那么可以使用如下方式实现视图之间的
它遵循MVC(模型-视图-控制器)模式,支持数据驱动的界面设计。 元对象系统与信号槽机制: Qt Meta-Object System(元对象系统)是Qt框架的一个重要特性,它引入了元对象编译器(moc),用于在编译时生成额外的...
大型C ++ Qt应用程序的模型视图ViewModel框架概述这个model-view-viewmodel框架旨在用于使用C ++编写的基于Qt的大型科学应用程序。 该项目是作为GUI重构的游乐场而创建的。 该框架的主要特点是: 用于存储GUI会话的...