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。

转载于:https://www.cnblogs.com/lvdongjie/p/3736780.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 动态生成fragment,Android动态加载fragment(fragment复用)

【实例简介】Android动态加载fragment(fragment复用)【实例截图】【核心代码】fm_reuse└── fm_reuse├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ └── example│ │ └── fm_reuse│ …

Linux内核3.0移植并基于Initramfs根文件系统启动

Linux内核移植与启动 Target borad&#xff1a;FL2440 Bootloader&#xff1a;U-boot-2010.09 交叉编译器&#xff1a;buildroot-2012.08 1.linux内核基础知识 首先&#xff0c;磨刀不误砍柴工。在动手进行linux内核移植之前&#xff0c;我们有必要对linux内核进行一定的了解。…

操作系统上机作业--实现shell(2)(多进程)

sh2.c: 实现shell程序&#xff0c;要求在第1版的基础上&#xff0c;添加如下功能 • 实现文件重定向 • $ echo hello >log • $ cat log • Hello 实现思路&#xff1a; 和sh1.c相比&#xff0c;主要是修改了cmd函数的实现过程。通过循环找出重定向符号"&g…

当泛型方法推断,扩展方法遇到泛型类型in/out时。。。

说到泛型方法&#xff0c;这个是.net 2.0的时候引入的一个重要功能&#xff0c;c#2.0也对此作了非常好的支持&#xff0c;可以不需要显试的声明泛型类型&#xff0c;让编译器自动推断&#xff0c;例如&#xff1a; 1 void F<T>(T value){} 2 //... 3 int i 0; 4 F(i); 此…

AOP相关

实现AOP的技术&#xff0c;主要分为两大类&#xff1a;一是采用动态代理技术&#xff0c;利用截取消息的方式&#xff0c;对该消息进行装饰&#xff0c;以取代原有对象行为的执行&#xff1b;二是采用静态织入的方式&#xff0c;引入特定的语法创建“方面”&#xff0c;从而使得…

操作系统上机作业--根据莱布尼兹级数计算PI(1)(多线程)

pi1.c: 使用2个线程根据莱布尼兹级数计算PI • 莱布尼兹级数公式: 1 - 1/3 1/5 - 1/7 1/9 - ... PI/4 • 主线程创建1个辅助线程 • 主线程计算级数的前半部分 • 辅助线程计算级数的后半部分 • 主线程等待辅助线程运行結束后,将前半部分和后半部分相加实现思路&#xff1…

四种途径将HTML5 web应用变成android应用

作为下一代的网页语言&#xff0c;HTML5拥有很多让人期待已久的新特性。HTML5的优势之一在于能够实现跨平台游戏编码移植&#xff0c;现在已经有很多公司在移动设备上使用HTML5技术。随着HTML5跨平台支持的不断增强和智能手机的迅速普&#xff0c;HTML5技术有着非常好的发展前景…

操作系统上机作业--根据莱布尼兹级数计算PI(2)(多线程)

pi2.c: 使用N个线程根据莱布尼兹级数计算PI • 与上一题类似&#xff0c;但本题更加通用化&#xff0c;能适应N个核心&#xff0c;需要使用线程参数来实现 • 主线程创建N个辅助线程 • 每个辅助线程计算一部分任务&#xff0c;并将结果返回 • 主线程等待N个辅助线程…

html 16进制 转换成字符串,js 字符串和16进制的互相转换

字符串转16进制function strToHexCharCode(str) {if(str "")return "";var hexCharCode [];hexCharCode.push("0x");for(var i 0; i < str.length; i) {hexCharCode.push((str.charCodeAt(i)).toString(16));}return hexCharCode.join(&qu…

数组以及冒泡排序

数组 1、概念&#xff1a;可以帮我一次声明多个同类型的变量&#xff0c;这些变量再内存中是连续存储的。 2、声明语法&#xff1a;数据类型[] 数组名 new 数据类型[数组长度] 数组长度&#xff1a;一次要声明的同类型的变量个数。是在定义这个数组的时候就确定了&#xf…

jQuery触发a标签的点击事件无效

1 <a id"workFrame" href"pages/work.html" target"FrameBox">首页</a> 2 3 $("#workFrame").tigger("click"); 上述的代码&#xff0c;其实挺正常的&#xff0c;但是怎么也触发不了a标签的cli…

操作系统上机作业--多线程排序

sort.c: 多线程排序 • 主线程创建一个辅助线程 • 主线程使用选择排序算法对数组的前半部分排序 • 辅助线程使用选择排序算法对数组的后半部分排序 • 主线程等待辅助线程运行結束后,使用归并排序算法归并数组的前半部分和后半部分 实现思路&#xff1a; ARRAY_CO…

jdk5下载链接

查看jdk版本 java -versionJDK下载 最新版本http://www.oracle.com/technetwork/java/javase/downloads/index.htmlJDK下载 版本1.5.22http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase5-419410.html#jdk-1.5.0_22-oth-JPR JDK…

html的细节优化,网站页面优化细节详解

原标题&#xff1a;网站页面优化细节详解SEO页面优化是继SEO结构优化之后&#xff0c;另一个重要优化地方;页面标题在每个页面中的关键位置&#xff0c;出现目标关键词&#xff0c;这是我们做页面优化的基础思路&#xff0c;关键词位置&#xff0c;都有哪些呢?第一个是关键位置…

突击优化算法!

Matlab语言可以与C/C语言转换或调用。 Matlab语句&#xff1a;load name 把name中文件的所有变量载入到工作空间中。save name 保存工作空间的变量到name.mat中。 cholesky分解把一个正定矩阵分为一个下三角矩阵和它转置矩阵的乘积。 两种创立符号函数的方法&#xff1a;sym函数…

操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)

pc1.c: 使用条件变量解决生产者、计算者、消费者问题 /* • 系统中有3个线程&#xff1a;生产者、计算者、消费者 • 系统中有2个容量为4的缓冲区&#xff1a;buffer1、buffer2 • 生产者生产a、b、c、‘d、e、f、g、h八个字符&#xff0c;放入到buffer1 • 计算者从b…

淘宝代码和html区别,taobao.html

taobao主题市场女装 /男装 /内衣 >鞋靴 /箱包 /配件 >童装玩具 /孕产 /用品 >家电 /数码 /手机 >女装 /男装 /内衣 >鞋靴 /箱包 /配件 >童装玩具 /孕产 /用品 >家电 /数码 /手机 >女装 /男装 /内衣 >鞋靴 /箱包 /配件 >童装玩具 /孕产 /用品 >…

程序各个段text,data,bss,stack,heap

网上找了一堆资料学习一下,了解这些, 有助于规化程序结构,优化代码; 使用gcc编译出来的程序,用size可以查看程序结构和大小, 如 1: #size hello 2: Text data bss dec hex filename 3: 778 200 4 982 3D6 hello 所以一个可执行的程序文件,结构分三部分: .text 代码段,用来存…

让 keil MDK 支持C99

打开options fot target-> C/C 在 Misc Controls 中添加 --c99. 转载于:https://www.cnblogs.com/svchao/p/4585034.html

html从日期格式中获取年,js转换日期格式(Js获取年月日及时间转换)

1、获取年、月、日和将时间戳转换成日期格式// 简单的一句代码var date new Date(时间戳); //获取一个时间对象/**1. 下面是获取时间日期的方法&#xff0c;需要什么样的格式自己拼接起来就好了2. 更多好用的方法可以在这查到 -> http://www.w3school.com.cn/jsref/jsref_o…