原文地址:Qt之模型/视图(实时更新数据)作者:一去丶二三里
上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧!

在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!
功能:
(1)添加委托(进度条)
(2)显示文件名称、大小、进度、速度、剩余时间、状态等。
(3)可进行添加、更新、删除、清空等操作。
(4)实时更新数据
先看一个效果图:

委托(进度条):

ProgressBarDelegate::ProgressBarDelegate(QObject *parent)
: QItemDelegate(parent)
{
}

void ProgressBarDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
if(index.column() == 2)
{
int progress = index.model ()->data(index, Qt::DisplayRole).toInt ();
QStyleOptionProgressBarV2 progressBarOption;
progressBarOption.state = QStyle:: State_Enabled;
progressBarOption.direction = QApplication:: layoutDirection ();
progressBarOption.rect = option.rect;
progressBarOption.fontMetrics = QApplication:: fontMetrics ();
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.textAlignment = Qt:: AlignCenter;
progressBarOption.textVisible = true;
progressBarOption.progress = progress;
progressBarOption.text = QString("%1%").arg(progressBarOption.progress);
QApplication:: style ()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
} else {
return QItemDelegate::paint (painter, option, index);
}
}

模型:
TableModel::TableModel(QObject *parent)
: QAbstractTableModel(parent), arr_row_list(NULL)
{
}
TableModel::~TableModel(void)
{
arr_row_list = NULL;
}
void TableModel::setHorizontalHeaderList(QStringList horizontalHeaderList)
{
horizontal_header_list = horizontalHeaderList;
}
void TableModel::setVerticalHeaderList(QStringList verticalHeaderList)
{
vertical_header_list = verticalHeaderList;
}
int TableModel::rowCount(const QModelIndex &parent) const
{
if(vertical_header_list.size() > 0)
return vertical_header_list.size();
if(NULL == arr_row_list)
return 0;
else
return arr_row_list->size();
}
int TableModel::columnCount(const QModelIndex &parent) const
{
if(horizontal_header_list.size() > 0)
return horizontal_header_list.size();
if(NULL == arr_row_list)
return 0;
else if(arr_row_list->size() < 1)
return 0;
else
return arr_row_list->at(0).size();
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if(NULL == arr_row_list)
return QVariant();
if(arr_row_list->size() < 1)
return QVariant();
if (role == Qt::TextAlignmentRole) 
{
return int(Qt::AlignLeft | Qt::AlignVCenter);
else if (role == Qt::DisplayRole) 
{
if(index.row() >= arr_row_list->size())
return QVariant();
if(index.column() >= arr_row_list->at(0).size())
return QVariant();
return arr_row_list->at(index.row()).at(index.column());
}
return QVariant();
}
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if(role==Qt::DisplayRole)  
{  
if(orientation==Qt::Horizontal) // 水平表头  
{  
if(horizontal_header_list.size() > section)
return horizontal_header_list[section];
else
return QVariant(); 
}  
else
{
if(vertical_header_list.size() > section)
return vertical_header_list[section]; // 垂直表头  
else
return QVariant();
}
}  
return QVariant(); 
}
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
Qt::ItemFlags flag = QAbstractItemModel::flags(index);  
// flag|=Qt::ItemIsEditable // 设置单元格可编辑,此处注释,单元格无法被编辑  
return flag;  
}
void TableModel::setModalDatas(QList< QStringList > *rowlist)
{
arr_row_list = rowlist;
}
void TableModel::refrushModel()
{
beginResetModel();
endResetModel();
emit updateCount(this->rowCount(QModelIndex()));
}

视图:
TableView::TableView(QWidget *parent)
: QTableView(parent)
{
this->setAlternatingRowColors(true);
this->setStyleSheet( "QTableView{background-color: rgb(250, 250, 115);"   
"alternate-background-color: rgb(141, 163, 215);}" ); 
this->setSelectionBehavior(QAbstractItemView::SelectRows);
this->horizontalHeader()->setStretchLastSection(true);
this->horizontalHeader()->setHighlightSections(false); 
this->verticalHeader()->setVisible(false);
this->setShowGrid(false);
this->setEditTriggers(QAbstractItemView::NoEditTriggers);
this->setSelectionMode(QAbstractItemView::ExtendedSelection);
model = new TableModel();
this->setModel(model);
this->initHeader();
model->setModalDatas(&grid_data_list);
progressbar_delegate = new ProgressBarDelegate();
this->setItemDelegate(progressbar_delegate);
connect(model, &TableModel::updateCount, this, &TableView::updateCount);
this->initHeader();
}
TableView::~TableView(void)
{
if(progressbar_delegate) {
delete progressbar_delegate;
progressbar_delegate = NULL;
}
if(model) {
delete model;
model = NULL;
}
grid_data_list.clear();
}
void TableView::addRow(QStringList rowList)
{
grid_data_list.append(rowList);
model->refrushModel();
}
void TableView::remove()
{
QModelIndexList model_index_list = this->selectedIndexes();
int model_count = model_index_list.count();
if(model_count <= 0)
return;
QList list_row;
for(int i=model_count-1; i>=0; i--)
{
QModelIndex model_index = model_index_list.at(i);
int row = model_index.row();
if(!list_row.contains(row))
list_row.append(row);
}
if(list_row.isEmpty())
return;
qSort(list_row);
for(int i=list_row.count()-1; i>=0; i--)
{
grid_data_list.removeAt(list_row.at(i));
}
model->refrushModel();
}
void TableView::clear()
{
grid_data_list.clear();
model->refrushModel();
}
int TableView::rowCount()
{
return model->rowCount(QModelIndex());
}
void TableView::initHeader()
{
QStringList header;
header << tr("name") << tr("size") << tr("progress") << tr("speed") << tr("left time") << tr("state");
model->setHorizontalHeaderList(header);
}
void TableView::changeValue()
{
//这里以10行尾列进行更新
int row_count = this->rowCount();
if(row_count < 10)
return;
for(int i=0; i<10; i++)
{
QStringList file_list = grid_data_list.at(i);
int progress = rand()0;
QStringList row_list;
row_list <<  file_list.at(0) << file_list.at(1) << QString::number(progress) << file_list.at(3) << file_list.at(4) << file_list.at(5);
grid_data_list.replace(i, row_list);
}
model->refrushModel();
}

完整的工程(源码)下载地址:http://download.csdn.net/detail/u011012932/6829783。
注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。
    作者:╰☆奋斗ing❤孩子`  原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101hhse.html。

[转载]Qt之模型/视图(实时更新数据)_vortex_新浪博客相关推荐

  1. [转载]Qt之获取本机网络信息_vortex_新浪博客

    原文地址:Qt之获取本机网络信息作者:一去丶二三里 经常使用命令行来查看一些计算机的配置信息. 1.首先按住键盘上的"开始键+R键",然后在弹出的对话框中输入"CMD&q ...

  2. [转载]Qt之模型/视图(自定义风格)_vortex_新浪博客

    原文地址:Qt之模型/视图(自定义风格)作者:一去丶二三里 关于自定义风格是针对视图与委托而言的,使用事件与QSS都可以进行处理,今天关于美化的细节讲解一下. 先看下图: 先撇开界面的美观性(萝卜青菜 ...

  3. Qt 方式问题_vortex_新浪博客

    放下那些博客上的典例,我发现我真的什么都做不成,再加的那段日子我仅仅是做了一个写字板,便觉得有点小开心了,"不就是这么简单吗",呵呵,其实还真不是.我发现qt的类太多了,你很难去真 ...

  4. [转载]Qt之解决中文乱码_vortex_新浪博客

    博主很给力 原文地址:Qt之解决中文乱码作者:一去二三里 在项目开发的过程中,中文乱码是比较常见的问题!用Qt开发也不例外,之前在做界面的时候没有发现什么问题,但是在程序移植的过程中问题出现了! 在W ...

  5. [转载]Qt之中文显示(QMessageBox、QLineEdit右键菜单等)_vortex_新浪博客

    原文地址:Qt之中文显示(QMessageBox.QLineEdit右键菜单等)作者:一去丶二三里 在编写Qt程序的时候,总会碰到中文问题,一直都很困惑,原本在使用QLineEdit的时候总会出现右键 ...

  6. [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景_vortex_新浪博客...

    很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...

  7. [转载]Qt之鼠标样式_vortex_新浪博客

    原文地址:Qt之鼠标样式作者:一去丶二三里 Qt中可以自定义鼠标样式,无论是为了美观,还是遵从同行业标准,或者说是界面友好性都需要了解. 使用setCursor(Qt::CursorShape)来设置 ...

  8. Linux命令大全【转载】_追逐梦想的顾咏丰_新浪博客

    1.显示日期的指令: date 2.显示日历的指令:cal 3.简单好用的计算器:bc 怎么10/100会变成0呢?这是因为bc预设仅输出整数,如果要输出小数点下位数,那么就必须要执行 scale=n ...

  9. EF更新使用AutoMapper_se7en3_新浪博客

    EF更新使用AutoMapper, var dbEntity= Mapper.Mapper(viewModel)这样写,有可能保存之后没有异常,但是数据库数据没有更新. 应该Mapper.Mapper ...

最新文章

  1. illegal instruction错误
  2. 终于当了回up主,来白嫖我历时半年总结的Java思维导图吧!!!
  3. CVPR 2018论文解读 | 基于域适应弱监督学习的目标检测
  4. 2015蓝桥杯C++A:饮料换购
  5. leetcode Course Schedule II
  6. QT5.15 安装教程
  7. WPS中设置一级、二级、三级标题以及正文和目录
  8. yii2 php7 mongodb,Yii2中MongoDB的使用方法-CURD
  9. 浏览器渲染原理及web前端分析
  10. :last-of-type , :last-child 无效的问题
  11. macOS 手动清理垃圾文件
  12. 口袋的天空(洛谷 P1195)
  13. 数据恢复(数据已经恢复)-附带软件Recoverit
  14. Android转换位图BUG,知其然不知其所以然
  15. linux没有i18n文件,【Linux】/etc/sysconfig/i18n文件详解
  16. 【Solr】--简介
  17. Android2.0 Release 1 Eclair API变化预览
  18. 计算机毕业设计ssm气象百事通系统wr8nn系统+程序+源码+lw+远程部署
  19. JSON解析合集:你再也不用怕JSON解析了!!!
  20. 请更换备份电池 pos机_UPS电池维护与保养

热门文章

  1. 怎样上传php文件到云服务器地址,php文件怎么导入到云服务器
  2. aws php sns,PHP中的AWS SNS HTTP订阅确认
  3. php 创建文本文件,php-创建文本文件以进行实时下载
  4. java贝叶斯分类器 开源_贝叶斯分类器
  5. mysql 备库同步_MYSQL主从库同步配置过程
  6. 亲密关系-【沟通提示】-如何把学习到的东西用到生活中
  7. 启动服务提示-bash: mongod: command not found
  8. git21天打卡day4-查看仓库地址
  9. 四川职称计算机英语,四川职称计算机考试报名细则
  10. 测试是个艺术活儿:测试需求分工原则