前段时间,我接触了,如何在一个QTableView中加入一个控件,类似于QCheckBox QProgressBar,QLineEdit等。

最近在项目中实际运用,才发现,在Qt中自定义委托,如果插入一个进度条。因为它很特殊,只能通过Paint进行绘画,而不是CreateEidtor()函数实现。

所以我就遇到问题:前期在表格里画好一列进度条时,后期如何及时更新进度条状态。如下图Qt中的例子

解决方法:今天才发现,实际Qt的MVC已经实现了自动更新,是我在Model中返回到QTableView的值写成%小数。于是在Delegate中获取界面上的int值总是0,以为没成功。。。。

稍微修改一下Model中的返回值就可以了,在界面中需要修改数据地方,只要调用Model中的setData()方法,里面调用 emit DataChanged()信号,就可以通知View和Delegate一起更新了。

源代码如下:

1、界面代码:QTableView、Model、Delegate初始化

/***函数介绍:初始化重建作业队列*输入参数:无*返回值:  无*/
void MainWindow::initReconJob()
{//数据源ReconJob job1;job1.setReconJobId(1);job1.setReconJobState(2);job1.setPatientId(1);job1.setPatientName("test");job1.setScanId(1);job1.setReconType(1);job1.setReconMode(1);job1.setSeriesDescrip("CT头部 ");job1.setSubTaskNum(15);job1.setFinishedSubTaskNum(0);job1.setRemainTime(95);job1.setPriority(1);job1.setRawDataFileName("rawData1.raw");ReconJob job2;job2.setReconJobId(2);job2.setReconJobState(1);job2.setPatientId(1);job2.setPatientName("test");job2.setScanId(1);job2.setReconType(1);job2.setReconMode(1);job2.setSeriesDescrip("CT头部 ");job2.setSubTaskNum(15);job2.setFinishedSubTaskNum(0);job2.setRemainTime(89);job2.setPriority(0);job2.setRawDataFileName("rawData2.raw");ReconJob job3;job3.setReconJobId(3);job3.setReconJobState(1);job3.setPatientId(1);job3.setPatientName("test");job3.setScanId(1);job3.setReconType(1);job3.setReconMode(1);job3.setSeriesDescrip("CT头部 ");job3.setSubTaskNum(15);job3.setFinishedSubTaskNum(0);job3.setRemainTime(89);job3.setPriority(0);job3.setRawDataFileName("rawData3.raw");reconQueue.append(job1);reconQueue.append(job2);reconQueue.append(job3);for(int i = 4; i < 12; i++){ReconJob job4;job4.setReconJobId(i);job4.setReconJobState(1);job4.setPatientId(1);job4.setPatientName("test");job4.setScanId(1);job4.setReconType(1);job4.setReconMode(1);job4.setSeriesDescrip("CT头部 ");job4.setSubTaskNum(15);job4.setFinishedSubTaskNum(0);job4.setRemainTime(89);job4.setPriority(0);job4.setRawDataFileName("rawData.raw");reconQueue.append(job4);}//自定义表模型reconqueueModel = new MoReconQueue();reconqueueModel->setReconQueue(reconQueue);//设置视图模型ui.tableView->setModel(reconqueueModel);//设置行交替颜色ui.tableView->setAlternatingRowColors(true);//只能单选一个项ui.tableView->setSelectionMode(QAbstractItemView::SingleSelection);//选择行为为行ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//内容窗口自适应//ui.tableView->resizeColumnsToContents();//隐藏第8列 总任务数ui.tableView->setColumnHidden(8,true);  //自定义表委托delReconQueue = new DelReconQueue();//设置视图委托ui.tableView->setItemDelegate(delReconQueue);//自定义表模型delReconQueue = new DelReconQueue();//设置视图委托ui.tableView->setItemDelegate(delReconQueue);//是否可以编辑在模型 MoReconQueue中flags()函数设置//编辑事件 可以调用委托处理编辑数据//ui.tableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);//最后一列全部填充View//ui.tableView->horizontalHeader()->setStretchLastSection(true);
}/***函数介绍:更新首个重建作业状态*输入参数:无*返回值:  无*/
void MainWindow::updateReconJobState(QList<QVariant> job)
{QVariant finishedTaskNum = job.at(9);reconqueueModel->setData(reconqueueModel->index(0,9),finishedTaskNum);qDebug() <<"ssssssssssssssssssssssssssssssssssssssss" ;
}


2、Model中的部分代码:修改Model中的某一项值。

//编辑一个项,(项索引,项值,角色)
bool MoReconQueue::setData(const QModelIndex &index,const QVariant &value, int role)
{   //模型索引要有效,必须是修改角色if (index.isValid()&& role == Qt::EditRole){//行号int row = index.row();//列号int column = index.column();//获得原重建作业参数ReconJob job = reconQueue.at(row);//更新重建作业参数switch (column){case 0:job.setReconJobId(value.toInt());break;case 1:job.setReconJobState(value.toInt());break;case 2:job.setPatientId(value.toInt());break;case 3:job.setPatientName(value.toString());break;case 4:job.setScanId(value.toInt());case 5:job.setReconType(value.toInt());break;case 6:job.setReconMode(value.toInt());break;case 7:job.setSeriesDescrip(value.toString());break;case 8:job.setSubTaskNum(value.toInt());break;case 9:job.setFinishedSubTaskNum(value.toInt());break;case 10:job.setRemainTime(value.toInt());break;case 11:job.setPriority(value.toInt());;break;case 12:job.setRawDataFileName(value.toString());;break;default:  return false;}//替换新的重建作业参数reconQueue.replace(row,job);//某项发生改变,发射信号( between topLeft and bottomRight inclusive)emit dataChanged(index, index);return true;}return false;
}

 从自定义的数据源中获取数据

/***函数介绍:获取类对象的属性值*输入参数:无*返回值:  无*/
QVariant MoReconQueue::reconQueueAt(int row, int column) const
{QVariant var;int temp;int temp1;switch (column){case 0: var = reconQueue.at(row).getReconJobId();break;case 1: var = reconQueue.at(row).getReconJobState();if(var == 1)var = "等待";else if (var == 2)var = "进行中";break;case 2: var = reconQueue.at(row).getPatientId();//设置'病人Id'格式字符串: P:00000x;6位10进制数,不足补0;var = QString("P:%1").arg(var.toInt(), 6, 10, QChar('0'));break;case 3: var = reconQueue.at(row).getPatientName();break;case 4: var = reconQueue.at(row).getPatientName();break;case 5: var = reconQueue.at(row).getReconType();if(var == 1)var = "PET重建";else if (var == 2)var = "CT重建";     break;case 6: var = reconQueue.at(row).getReconMode();if(var == 1)var = "auto";else if (var == 2)var = "offline";    break;case 7: var = reconQueue.at(row).getSeriesDescrip();break;case 8: var = reconQueue.at(row).getSubTaskNum();break;case 9: temp = reconQueue.at(row).getFinishedSubTaskNum();temp1 = reconQueue.at(row).getSubTaskNum();//var = QString("%1 / %2").arg(temp,2,10,QChar('0')).arg(temp1,2,10,QChar('0')); var = temp;break;case 10: temp = reconQueue.at(row).getRemainTime();var = QString("%1:%2s").arg(temp / 60, 2, 10, QChar('0')).arg(temp % 60, 2, 10, QChar('0'));;break;case 11: var = reconQueue.at(row).getPriority();break;case 12: var = reconQueue.at(row).getRawDataFileName();break;default:  var = "无";}return var;
}

 3、自定义委托中,重载Paint()函数

//重载绘制函数
void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const
{qDebug() << "`````````````````````行:"<< index.row() << "``````````````列:" << index.column() ;//如果是'已经完成子任务数'if (index.row()==0 && index.column() == 9){const QAbstractItemModel *itemModel = index.model();//获得索引对应Model中的数据//double finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).toDouble();int finishedSubTaskNum = index.data().toInt();int subTaskNum = itemModel->data(itemModel->index(index.row(),8), Qt::DisplayRole).toInt();qDebug() << "```````````````````````````````````finishedSubTaskNum:" << finishedSubTaskNum ;qDebug() << "```````````````````````````````````subTaskNum:" << subTaskNum ;//进度条的风格选项QStyleOptionProgressBarV2  progressBarOption ;progressBarOption.rect = option.rect;progressBarOption.minimum = 0;progressBarOption.maximum = subTaskNum;progressBarOption.progress = finishedSubTaskNum;double t = finishedSubTaskNum/subTaskNum;progressBarOption.text = QString("%1 / %2").arg(finishedSubTaskNum,2,10,QChar('0')).arg(subTaskNum,2,10,QChar('0'));progressBarOption.textVisible = true;//绘制进度条QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);}else{//否则调用默认委托QStyledItemDelegate::paint(painter, option, index);}}

 

实现结果:


参考文章:

Qt自定义委托在QTableView中绘制控件、图片、文字

Qt实现表格内进度条展示数据

更新QTableView中的进度条状态相关推荐

  1. 如何在UIAlertView中显示进度条

    今天这个问题是,在一个iPhone程序中,我要在后台做大量的数据处理,希望在界面上显示一个进度条(Progress Bar)使得用户了解处理进度.这个进度条应该是在一个模态的窗口中,使界面上其他控件无 ...

  2. UIAlertView中显示进度条 ios iphone xcode

    以下内容适用于iOS 2.0+. 我们知道,如果要显示一个alert窗口(比如用来显示错误或警告信息.询问用户是否确认某操作等等),只要简单地创建一个UIAlertView对象,再调用其show方法即 ...

  3. Winform中使用进度条的一个例子

    因为在winform程序中,UI线程负责界面相关的工作. Winform中使用进度条的方法有很多,可以直接创建一个新的线程Thread执行耗时的方法:也可以使用线程池. 例如: //使用线程池异步执行 ...

  4. Xamarin XAML语言教程Xamarin.Forms中构建进度条

    Xamarin XAML语言教程Xamarin.Forms中构建进度条 ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度条总是水平放置的.本节将讲解如何使用进度条. 注意:进度条在 ...

  5. 在Activity的Title中加入进度条

    在 Activity 的标题栏中显示进度条不失为一个好办法,下面是实现代码: // 不明确进度条 requestWindowFeature(Window.FEATURE_INDETERMINATE_P ...

  6. 在Perl程序中显示进度条之多姿多彩的自写代码

    在Perl程序中显示进度条之多姿多彩的自写代码 yixf 于 2011-11-29,09:57   方法一 1 2 3 4 5 6 7 8 #!/usr/bin/perlmy $max = 10; f ...

  7. linux mv 递归拷贝,奇技淫巧 - 给Linux中的cp和mv命令中添加进度条的高级拷贝

    GNU cp和GNU mv命令用于在GNU/Linux操作系统中复制和移动文件和目录.这两个命令缺少的一个特性是它们不显示任何进度条.如果复制一个大文件或目录,您就不知道完成复制过程需要多长时间,也不 ...

  8. Pytest----pytest-sugar 执行过程中显示进度条

    [原文链接]Pytest----pytest-sugar 执行过程中显示进度条 Pytest-sugar是一款用来改善控制台显示的插件,增加了进度条显示,使得在用例执行过程中可以看到进度条,而且进度条 ...

  9. 【技巧】Excel单元格中添加进度条

    制作excel表格中有很多小技巧可以帮助我们更好的观察数据,上次和大家分享如何将表格转换成图表形式来查看,今天和大家分享,如何在单元格中又有数据还能设置出进度条,直观观察数据. 其实具体操作很简单,我 ...

最新文章

  1. 试用JAVA的免费空间JHOST
  2. 数据中心暖通相关知识与空调规划设计知识
  3. Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名...
  4. C++中this指针的使用方法.
  5. 利用T-SQL处理SQL Server数据库表中的重复行
  6. java中PrepareStatement使用的一点小问题
  7. Maven 菜鸟教程 4 常用dos命令
  8. 制作PCB的基本设计流程;
  9. 送书 | 《Python3爬虫实战——数据清洗、数据分析与可视化》
  10. linux 内核配置otg,Linux 4.9.11 测试USB OTG功能
  11. no default constructor found either
  12. H5 开发内嵌页面跨域问题
  13. python修改表格居中_Python使用openpyxl对xlsx表格合并单元格、设置单元格样式的操作...
  14. Excel表格 |两列数据(多列)合并一列且自动换行
  15. Installation Oracle11gR2 RAC on SuSE Linux Enterprise Server 11
  16. 重用vimium快捷键
  17. MACD指标与成交量指标怎么配合使用?耳闻过成交量指标可以辅助MACD指标判势吗?
  18. 北斗导航 | SINS/GPS超紧组合系统完好性监测算法(代码后续添加)
  19. 2021年美容师(中级)多少分及格及美容师(中级)考试技巧
  20. 纵向LR+同态加密+feature binning方法步骤

热门文章

  1. 【简●解】POJ 1845 【Sumdiv】
  2. 【51Nod1773】A国的贸易 解题报告
  3. Java方法及构造方法
  4. python3对接聊天机器人API
  5. Slimer软工课设日报-2016年6月30日
  6. 今天被BSE指摘了2个问题,感觉很典型
  7. JavaScript中的高级特性及特别对象、属性和方法
  8. python基础之类的属性方法、魔术方法普通方法
  9. 前端开发响应式布局和移动端布局有哪些特点和区别?
  10. 为什么那么多自学WEB前端的人后来都放弃了?