0


QTabelWidget表格的插入、删除、更新、动态滑动条以及配合QFile进行表格内容的长期存储

QTabelWidget表格的插入、删除、更新以及配合QFile进行表格内容的长期存储

想实现表格 每一步都不能错过

【1】QTabelWidget界面初始化

在这里插入图片描述

【2】QTabelWidget效果图

在这里插入图片描述

【3】QTabelWidget初始化

  1. /******************************************************************清洗日志表格初始化******************************************************/voidMainWindow::MenuRinseLogInit(){
  2. ui->PB_updatetabl->hide();//刷新表格按钮 清洗结束才出现//对表格的初始化
  3. ui->tableWidget_rinselog->setRowCount(0);// 设置表格行数
  4. ui->tableWidget_rinselog->setColumnCount(4);// 设置表格列数//添加表头内容
  5. QStringList tablehead;
  6. tablehead.append(tr("清洗模式"));
  7. tablehead.append(tr("开始时间"));
  8. tablehead.append(tr("结束时间"));
  9. tablehead.append(tr("总清洗时间"));
  10. ui->tableWidget_rinselog->setHorizontalHeaderLabels(tablehead);
  11. ui->tableWidget_rinselog->setShowGrid(true);//设置显示网格//表头风格
  12. ui->tableWidget_rinselog->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(189,255,253);""font:15pt;color: black;};");//设置表头第一行风格//表格内容风格
  13. ui->tableWidget_rinselog->setStyleSheet("background-color:rgb(255,255,255);""color: blue;");
  14. QFont font =ui->tableWidget_rinselog->font();
  15. font.setBold(false);//不加粗
  16. font.setFamily("PingFang SC Medium");
  17. ui->tableWidget_rinselog->setFont(font);//设置字体
  18. ui->tableWidget_rinselog->verticalHeader()->setHidden(true);//隐藏行号列
  19. ui->tableWidget_rinselog->resizeColumnsToContents();//表格所有列自动适应文本大小
  20. ui->tableWidget_rinselog->resizeRowsToContents();//表格所有行自动适应文本大小
  21. ui->tableWidget_rinselog->setEditTriggers(QAbstractItemView::NoEditTriggers);// 设置表格内容不可编辑
  22. ui->tableWidget_rinselog->horizontalHeader()->setResizeContentsPrecision(QHeaderView::Fixed);//设置表头不可拖动
  23. ui->tableWidget_rinselog->setSelectionMode(QAbstractItemView::NoSelection);//设置表格内容不可选
  24. ui->tableWidget_rinselog->horizontalHeader()->setStretchLastSection(true);//行头自适应表格
  25. ui->tableWidget_rinselog->horizontalHeader()->setFixedHeight(30);//设置表头高度
  26. ui->tableWidget_rinselog->verticalHeader()->setDefaultSectionSize(30);//设置行高度//ui->tableWidget_rinselog->setFrameShape(QFrame::StyledPanel);//设置边框跟单元格差不多//去除选中虚线框
  27. ui->tableWidget_rinselog->setFocusPolicy(Qt::NoFocus);//点击表时不对表头行光亮(获取焦点)
  28. ui->tableWidget_rinselog->horizontalHeader()->setHighlightSections(false);
  29. ui->tableWidget_rinselog->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//平均列宽,固定
  30. ui->tableWidget_rinselog->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);//垂直滚动条显示
  31. ui->tableWidget_rinselog->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);//水平滚动显示//设置纵向滚动条样式
  32. ui->tableWidget_rinselog->verticalScrollBar()->setStyleSheet("QScrollBar{background-color:rgb(255,255,255); width:30px;}""QScrollBar::handle{background-color:rgb(189,255,253); border:2px solid transparent; border-radius:5px;}""QScrollBar::handle:hover{background-color:rgb(189,255,253);}""QScrollBar::sub-line{background:transparent;}""QScrollBar::add-line{background:transparent;}");// //设置横向滚动条样式// ui->tableWidget_rinselog->horizontalScrollBar()->setStyleSheet(// "QScrollBar{background-color:rgb(255,255,255); height:20px;}"// "QScrollBar::handle{background-color:rgb(255,170,0); border:2px solid transparent; border-radius:5px;}"// "QScrollBar::handle:hover{background-color:rgb(255,170,0);}"// "QScrollBar::sub-line{background:transparent;}"// "QScrollBar::add-line{background:transparent;}");
  33. ui->tableWidget_rinselog->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);//设置滑动效果//设置手动滑动事件
  34. m_scrollBarV = ui->tableWidget_rinselog->verticalScrollBar();
  35. QObjectList objectList = ui->tableWidget_rinselog->children();for(int i =0; i < objectList.count(); i++){if(objectList.at(i)->objectName()=="qt_scrollarea_viewport"){
  36. objectList.at(i)->installEventFilter(this);}}//设置表格一直显示最后内容=========================在每次插入都要写这个 不然不会定位到最后
  37. ui->tableWidget_rinselog->scrollToBottom();//使用进度条表示写了多少
  38. ui->progressBar__tab->setRange(0,100);
  39. ui->progressBar__tab->setValue(0);
  40. ui->progressBar__tab->hide();}

【4】QTabelWidget内容写入文件和读出

  1. /*************************************************************表格加载进文件和文件加载进表格***********************************************//*实际表格内容在机子重启后会消失,所以需要写进文件,下次开机从文件写入*/
  2. QString MainWindow::LoadTabtoFileOrFileLoadtoTab(QString tabelflag){//设置标志位 开机 关机if(tabelflag =="写入文件")//将今日清洗的数据全部存入文件 ====================[放在清洗结束关机前]{
  3. QString alldata;
  4. QString writeRowClumAlldata;//17行 4列uint32_t row = ui->tableWidget_rinselog->rowCount();//获取行uint8_t colum =ui->tableWidget_rinselog->columnCount();//获取列qDebug()<<"行 列 "<<row<<colum<<endl;if(row ==0&&(colum ==4))//今日未清洗,表格没插入{qDebug()<<"there is no rinse record today"<<endl;return"";}//使用静态变量存储表格内容for(unsignedint i=row;i<=row;i++)//一行一行的写入文件{
  5. QTableWidgetItem *item1 = ui->tableWidget_rinselog->item(i-1,2);//获取单元格地址if(item1 ==NULL){//跳过不写入//跳过 }else{for(unsignedint j=0;j<colum;j++){qDebug()<<"行内容="<<ui->tableWidget_rinselog->item(i-1,j)->text()<<endl;
  6. alldata.append(ui->tableWidget_rinselog->item(i-1,j)->text()+"@");//最后带@}//qDebug()<<"alldata="<<alldata<<endl;//存储进文件包括:行,列,表格所有内容
  7. writeRowClumAlldata =QString("%1@%2@%3").arg(row).arg(colum).arg(alldata);//qDebug()<<"writeRowClumAlldata="<<writeRowClumAlldata<<endl;//写入文件
  8. datastorage.DataStorageManage(writeRowClumAlldata,RinseLog);//实际内容:行 列 数据 \n}}}elseif(tabelflag =="写入表格")//加载进表格=================================[在开机初始化时]{qDebug()<<"flag="<<tabelflag<<endl;//每次点击下一页 页码++//读取5行4列内容=================从文件读取数据 每次读取17行 自行选择
  9. QString readRowClumAlldata = datastorage.ReadStorageRinseLogData(RinseLog,17,"下一页");//包括换行符if(readRowClumAlldata==""|| readRowClumAlldata=="\n")//文件空{qDebug()<<"file data is empty"<<endl;return readRowClumAlldata;}
  10. QStringList list = readRowClumAlldata.split("\n");//分割qDebug()<<"readRowClumAlldata="<<readRowClumAlldata<<endl;qDebug()<<"list_size="<<list.size()<<"list="<<list<<endl;
  11. list.removeLast();//删除最后一个无用字符qDebug()<<"list_size="<<list.size()<<"list="<<list<<endl;for(int i=0;i<list.size();i++)//=17执行十七遍{
  12. QStringList listdata=QString("%1").arg(list.at(i)).split("@");
  13. listdata.removeLast();//删除最后一个无用字符uint32_t row = listdata.at(0).toInt();uint8_t colum = listdata.at(1).toInt();if(row ==0&&(colum ==4))//今日未清洗{qDebug()<<"there is no rinse record today"<<endl;return"";}qDebug()<<"行 列 数据"<<row<<colum<<listdata<<endl;//删除行列
  14. listdata.removeFirst();//行
  15. listdata.removeFirst();//列
  16. ui->tableWidget_rinselog->insertRow(ui->tableWidget_rinselog->rowCount());//不管值等于多少,每次只插入一行for(unsignedint j=0;j<colum;j++){if(j ==0){//清洗模式
  17. ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,j,newQTableWidgetItem(tr(listdata.at(j).toUtf8())));//设置对齐
  18. ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,j)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);}elseif(j==1){//开始时间
  19. ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,j,newQTableWidgetItem(tr(listdata.at(j).toUtf8())));//设置对齐
  20. ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,j)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);}elseif(j==2){//结束时间
  21. ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,j,newQTableWidgetItem(tr(listdata.at(j).toUtf8())));//设置对齐
  22. ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,j)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);}elseif(j==3){//总时间
  23. ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,j,newQTableWidgetItem(tr(listdata.at(j).toUtf8())));//设置对齐
  24. ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,j)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);}}//执行一次,删除列表4个元素 元素个数=行*列
  25. listdata.removeFirst();
  26. listdata.removeFirst();
  27. listdata.removeFirst();
  28. listdata.removeFirst();//qDebug()<<"listdata="<<listdata<<"listdata_size"<<listdata.size()<<endl;}
  29. ui->tableWidget_rinselog->scrollToBottom();//滑动条最底部}else//不满足条件调用此函数时 直接返回{return"";}return"1";}

【5】QTabelWidget插入表格和写入文件

  1. //插入1行
  2. ui->tableWidget_rinselog->insertRow(ui->tableWidget_rinselog->rowCount());//尾插 依次往后//清洗模式 某行0列插入
  3. ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,0,newQTableWidgetItem(tr("强制冲洗")));//设置对齐 垂直和居中
  4. ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,0)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//开始时间
  5. QStringList split = ui->label_time->text().split(":");
  6. split.removeLast();
  7. endtime = split.at(0).toInt()*60+split.at(1).toInt();//总强制冲洗分钟
  8. QString add =QString("%1:%2").arg(split.at(0)).arg(split.at(1));;//静态变量只初始化一次 2022/1/1//开始时间只显示一次
  9. ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,1,newQTableWidgetItem(tr("%1%2%3").arg(ui->label_date->text()).arg(" ").arg(add)));//设置对齐
  10. ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,1)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  11. ui->tableWidget_rinselog->hideRow(currRow);//隐藏行,读在表格时在显示//结束时间=系统时间+清洗总时间staticuint32_t totalmin = endtime+starttime;uint8_t hh =totalmin/60;uint8_t min =totalmin%60;
  12. QString h ;
  13. QString m;if(hh<10){
  14. h =QString("0%1").arg(hh);}else{
  15. h=QString("%1").arg(hh);}if(min<10){
  16. m =QString("0%1").arg(min);}else{
  17. m=QString("%1").arg(min);;}
  18. currow = currRow;//不管在那种清洗模式 切换回来后还是这个清洗模式的行
  19. rinsehh = h;//结束时间 小时
  20. rinsemm = m;// 结束时间 分钟
  21. rinsetotaltime = starttime;//总时间
  22. ui->tableWidget_rinselog->showRow(currow);//显示行//结束时间
  23. ui->tableWidget_rinselog->setItem(currow,2,newQTableWidgetItem(tr("%1 %2:%3").arg(ui->label_date->text()).arg(rinsehh).arg(rinsemm)));
  24. ui->tableWidget_rinselog->repaint();//设置对齐
  25. ui->tableWidget_rinselog->item(currow,2)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//总时间=ui->label_rinseleft的开始时间
  26. ui->tableWidget_rinselog->setItem(currow,3,newQTableWidgetItem(tr("%1小时%2分钟").arg(rinsetotaltime/60).arg(rinsetotaltime%60)));
  27. ui->tableWidget_rinselog->repaint();//设置对齐
  28. ui->tableWidget_rinselog->item(currow,3)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  29. datastorage.DataStorageManage(QString("强制冲洗 》= 2 %1 水洗:总时间=%2 固定时间=%3").arg(QDateTime::currentDateTime().toString("hh:mm:ss")).arg(ui->label_rinseleft->text().toUInt()).arg(ui->stage1_time_1->text()),PrintfLog);//实际内容:行 列 数据 \n
  30. ui->tableWidget_rinselog->viewport()->update();//刷新内容
  31. ui->tableWidget_rinselog->update();//刷新控件
  32. ui->tableWidget_rinselog->show();
  33. ui->widget_10->update();//刷新
  34. ForcedRinseFlag =0;//不去后台看清洗日志直接写入文件,或者在清洗界面连续水洗LoadTabtoFileOrFileLoadtoTab("写入文件");

【6】QTabelWidget写文件函数和都文件函数

  1. if(type == RinseLog)//存储清洗日志{
  2. QFile file;
  3. file.setFileName(RinseLogStoragePath);if(!file.open(QIODevice::WriteOnly | QIODevice::Append)){//追加写入 每次一行qDebug()<<"RinseLogStorageFIle open fail";return;}//表格数据会将每天的数据显示在清洗日志,然后和今天的清洗内容一起写入吧表格,为防止重复,每次写入清空
  4. file.write(data.toUtf8());
  5. file.close();}
  1. /*=======================清洗日志表格,只能一行一行获取===============*/
  2. QString dataStorage::ReadStorageRinseLogData(StorageType type,uint32_t LineNum,QString page){//当一行数据行小于10,大小占74
  3. QString FilePath;
  4. QString filedata;staticuint64_t filepos=0;//表格页码控制=============表格1页=17行
  5. filedata.clear();if(type == RinseLog){
  6. FilePath =RinseLogStoragePath;}
  7. QFile file(FilePath);if(!file.open(QIODevice::ReadOnly)){qDebug()<<file.errorString()<<endl;return"";}qDebug()<<"文件大小:"<< file.size()<<endl;
  8. filesize=file.size();//获取文件大小------------------随时变化
  9. QTextStream out(&file);//使用文本流来控制if(page =="下一页"&& LineNum ==17){
  10. file.seek(filepos);//=============================设置每次读取后光标移动for(uint32_t i=1;i<=LineNum;i++){
  11. QByteArray filearray = file.readLine();//1@4@水洗@开始时间@结束时间@总时间@\n
  12. filedata.append(filearray);}
  13. filepos = out.pos();//============================记录最后的文本光标
  14. filepossize=filepos;qDebug()<<"下一页file->pos="<<filepos<<endl;}qDebug()<<"filedata1="<<filedata<<endl;
  15. file.close();return filedata;}

【7】QTabelWidget表格上下页

connect(ui->PB_updatetabl, SIGNAL(clicked()), this, SLOT(PB_SystemAndRinseLog()));

  1. /*表格:系统日志和清洗日志处理槽函数的处理*/voidMainWindow::PB_SystemAndRinseLog(){
  2. QPushButton *button =qobject_cast<QPushButton *>(sender());if(button == ui->PB_updatetabl)//代码自动点击实现clik{//离线模式清洗自动停止开启的解决
  3. ui->tableWidget_rinselog->showRow(currow);//显示行//结束时间
  4. ui->tableWidget_rinselog->setItem(currow,2,newQTableWidgetItem(tr("%1 %2:%3").arg(ui->label_date->text()).arg(rinsehh).arg(rinsemm)));//设置对齐
  5. ui->tableWidget_rinselog->item(currow,2)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//总时间=ui->label_rinseleft的开始时间
  6. ui->tableWidget_rinselog->setItem(currow,3,newQTableWidgetItem(tr("%1小时%2分钟").arg(rinsetotaltime/60).arg(rinsetotaltime%60)));//设置对齐
  7. ui->tableWidget_rinselog->item(currow,3)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  8. datastorage.DataStorageManage(QString("ui->PB_updatetabl %1 水洗:总时间=%2 固定时间=%3").arg(QDateTime::currentDateTime().toString("hh:mm:ss")).arg(ui->label_rinseleft->text().toUInt()).arg(ui->stage1_time_1->text()),PrintfLog);//实际内容:行 列 数据 \n
  9. ui->PB_updatetabl->hide();LoadTabtoFileOrFileLoadtoTab("写入文件");}elseif(button == ui->PB_uppage)//上一页{
  10. ui->progressBar__tab->hide();
  11. pageflag=1;
  12. ui->tableWidget_rinselog->verticalScrollBar()->setValue(ui->tableWidget_rinselog->verticalScrollBar()->value()-520);//qDebug()<<"上一页滑动条的值="<< ui->tableWidget_rinselog->verticalScrollBar()->value()<<endl;}elseif(button == ui->PB_downpage)//下一页{staticbool endflag=false;if(pageflag ==1&& ui->tableWidget_rinselog->rowCount()>17){
  13. ui->progressBar__tab->hide();
  14. ui->tableWidget_rinselog->verticalScrollBar()->setValue(ui->tableWidget_rinselog->verticalScrollBar()->value()+520);}if(endflag ==false)//============作用:只在读取文件时进入{
  15. ui->progressBar__tab->show();
  16. QString readRowClumAlldata =LoadTabtoFileOrFileLoadtoTab("写入表格");if(readRowClumAlldata==""){qDebug()<<"readRowClumAlldata"<<readRowClumAlldata<<endl;
  17. ui->tableWidget_rinselog->scrollToBottom();//滑动条最底部}uint64_t filesize = datastorage.filesize;uint64_t filepos = datastorage.filepossize;if(filesize ==filepos ){
  18. endflag =true;}int value =100-(filepos%filesize)%100;//qDebug()<<"filesize"<<filesize<<"filepos"<<filepos<<"value"<<value<<endl;
  19. data_lib->SendttyAT0(tr("【=====filesize======】%1【=====filepos=====】%2【====value====】").arg(filesize).arg(filepos).arg(value));
  20. ui->progressBar__tab->setValue(value);if(value ==100){
  21. ui->progressBar__tab->setStyleSheet("color:red");
  22. ui->progressBar__tab->update();}}}}

【8】QTabelWidget表格滑动事件Event

  1. boolMainWindow::eventFilter(QObject *watched, QEvent *event){/******************************表格拖动事件*************************************/staticint press_y =0;staticint move_y =-1;staticint release_y =0;static QDateTime pressDateTime;static QPropertyAnimation *animation =new QPropertyAnimation;if("qt_scrollarea_viewport"!= watched->objectName()){returnfalse;}int scrollV_max = m_scrollBarV->maximum();int scrollV_min = m_scrollBarV->minimum();//根据鼠标的动作——按下、放开、拖动,执行相应的操作if(event->type()== QEvent::MouseButtonPress){//记录按下的时间、坐标
  2. pressDateTime =QDateTime::currentDateTime();
  3. move_y =QCursor::pos().y();
  4. press_y = move_y;
  5. animation->stop();}elseif(event->type()== QEvent::MouseButtonRelease){//鼠标放开,根据鼠标拖动的垂直距离和持续时间,设置窗口滚动快慢程度和距离if(animation->targetObject()!= m_scrollBarV){
  6. animation->setTargetObject(m_scrollBarV);
  7. animation->setPropertyName("value");}
  8. move_y =-1;
  9. release_y =QCursor::pos().y();qDebug()<<"MouseButtonRelease QCursor::pos().y()="<<QCursor::pos().y();
  10. QObject *parent_obj = watched->parent();if(parent_obj !=0|| parent_obj->inherits("QAbstractItemView")){QTimer::singleShot(150,(QAbstractItemView *)parent_obj
  11. ,SLOT(clearSelection()));}int endValue =0;int pageStep;if(release_y - press_y !=0&&qAbs(release_y - press_y)>45){qDebug()<<"obj->objectName()="<<watched->objectName();int mseconds = pressDateTime.msecsTo(QDateTime::currentDateTime());qDebug()<<"mseconds="<<mseconds;int limit =440;
  12. pageStep =240;//scrollBarV->pageStep();qDebug()<<"pageStep="<<pageStep;if(mseconds > limit)//滑动的时间大于某个值的时候,不再滚动(通过增加分母){
  13. mseconds = mseconds +(mseconds - limit)*20;}if(release_y - press_y >0){
  14. endValue = m_scrollBarV->value()- pageStep *(200.0/ mseconds);//.0避免避免强制转换为整形if(scrollV_min > endValue){
  15. endValue = scrollV_min;}}elseif(release_y - press_y <0){
  16. endValue = m_scrollBarV->value()+ pageStep *(200.0/ mseconds);if(endValue > scrollV_max){
  17. endValue = scrollV_max;}}if(mseconds > limit){
  18. mseconds =0;//滑动的时间大于某个值的时候,滚动距离变小,减小滑动的时间}
  19. animation->setDuration(mseconds +550);
  20. animation->setEndValue(endValue);
  21. animation->setEasingCurve(QEasingCurve::OutQuad);
  22. animation->start();returntrue;}}elseif(event->type()== QEvent::MouseMove && move_y >=0){//窗口跟着鼠标移动int move_distance =QCursor::pos().y()- move_y;int endValue = m_scrollBarV->value()- move_distance;if(scrollV_min > endValue){
  23. endValue = scrollV_min;}if(endValue > scrollV_max){
  24. endValue = scrollV_max;}
  25. m_scrollBarV->setValue(endValue);qDebug()<<"endValue="<<endValue;qDebug()<<"move_distance="<<move_distance;
  26. move_y =QCursor::pos().y();}returnQMainWindow::eventFilter(watched,event);}/******************************表格拖动事件*************************************/

over 祝你好运

标签: ui QTabelWidget qt

本文转载自: https://blog.csdn.net/m0_45463480/article/details/126436743
版权归原作者 「QT(C++)开发工程师」 所有, 如有侵权,请联系我们删除。

“QTabelWidget表格的插入、删除、更新、动态滑动条以及配合QFile进行表格内容的长期存储”的评论:

还没有评论