上两节简单介绍了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。
Qt之模型/视图(实时更新数据)
时间: 2024-12-11 23:30:41
Qt之模型/视图(实时更新数据)的相关文章
Qt之模型/视图(委托)
# -*- 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 架构中,视图是数据从模型到最终用户的途径.数据通过视图向用户进行显示. 此时,这种显示方式不必须同模型的存储结构相
Qt之模型/视图(自定义风格)
Qt之模型/视图(自定义风格) 关于自定义风格是针对视图与委托而言的,使用事件与QSS都可以进行处理,今天关于美化的细节讲解一下. 先看下图: 先撇开界面的美观性(萝卜青菜,各有所爱),就现有的这些风格,使用QSS + Qt二维绘图已经绰绰有余了.当然,如何让界面更美观,这个没有什么捷径,我只能说一句:无他,唯手熟尔!基本功搞扎实了,实现起来就会游刃有余...void DetailProgressBar::paint(QPainter *painter, const QStyleOptionVi
Qt之模型/视图(委托)
概念 不同于模型 - 视图 - 控制器模式,模型/视图设计不包括用于管理与用户交互的一个完全独立的组件.一般情况,视图负责将模型数据呈现给用户以及处理用户输入.为了输入更加具有灵活性,则由委托来执行交互.这些组件提供输入功能,且在一些视图中还负责渲染个别项目.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托能够通过实现的paint()和sizeHint()函数来展示它们的内容.然而,简单基础部件的委托可以继承QItemDelegate而不是QAbstractItem
实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable
https://gorails.com/episodes/how-to-use-turbolinks-clearCache?autoplay=1 用途: 更方便的实时从服务器更新局部网页,在这页更新了一条记录的显示方式, 再打开的之前网页的相同位置或相同的功能模块显示也会同步更新. 把Turbolinks.clearCache(), Turbolinks.clearCache(); 比如放在你写的xx.js.erb的第一行. 如果不加这句话,turbolinks只会reload之前的网页中的数据
AJAX制作JSON格式的实时更新数据的方法
之前有写过这样的文章,但是出现了几个问题,第一,如果每秒都像数据库发送请求势必会造成服务器的压力过大,第二,如果使用JS的话,是不可以取得系统时间的,因为JS运行在客户端,所以只能取得客户端时间, 如此的话,就需要在后台计算好时间差,然后前台得到时间差进行倒计时计算,并且更新数据 JS代码如下: var i = 0; var ballNum = ""; var flag = true; var timer_showCountDown = null; var leftTime; func
Qt之模型/视图(自定义按钮)
简述 衍伸前面的章节,我们对QTableView实现了数据显示.自定义排序.显示复选框.进度条等功能的实现,本节主要针对自定义按钮进行讲解,这节过后,也希望大家对自定义有更深入的了解,在以后的功能开发过程中,相信无论遇到什么样式形式,我们都可以很好地实现. 简述 效果 QStyledItemDelegate 源码 衍伸 效果 QStyledItemDelegate 源码 .h 包含显示按钮需要用到的智能指针,按钮的宽度.高度.按钮之间的间距.鼠标的坐标等. class TableViewDele
AJAX制作JSON格式的局部实时更新数据的方法
废话不多,上代码,前台: 主要使用了死循环一秒钟读取JS一次去刷新页面(递归的思想)单独对ShowData这个DIV的数据进行刷新 ,个人觉得还是需要优化的.请大神指点 <script type="text/javascript"> $(function () { var i = 0; function setTimeOutPost() { $.ajax({ type: "post", url: "/UserControl/DoData.ash
QT——模型/视图(model/view)
数据项中引入模型/视图架构,可以方便的将数据与表现层分开. ------------------------------------- 模型Model:一般来说,Model里面并不真正存储数据(数据少的话也可以直接存储在Model里),只是负责从诸如磁盘文件,数据库,网络通讯等获得源数据,并提供给View,View对数据进行修改,然后再通过Model更新源数据. Model 另一个重要工作时为源数据添加索引(ModelIndex).列表形式采用row/colum编号,树形式为建立父子间的层次关系
QT 模型/视图 编程 委托篇
委托类 概述 与模型-视图-控制器模式不同,模型/视图设计不包括用于管理与用户交互的完全独立的组件.通常,视图负责向用户表示模型数据,并处理用户输入.为了在获取输入的方式上允许一定的灵活性,交互由委托执行.这些组件提供输入功能,并负责在某些视图中呈现各个项.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托应该能够通过实现paint()和sizeHint()函数来呈现它们自己的内容.然而,简单的基于widget的委托可以子类化QItemDelegate而不是QAbst