0


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

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

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

【1】QTabelWidget界面初始化

在这里插入图片描述

【2】QTabelWidget效果图

在这里插入图片描述

【3】QTabelWidget初始化

/******************************************************************清洗日志表格初始化******************************************************/voidMainWindow::MenuRinseLogInit(){
    ui->PB_updatetabl->hide();//刷新表格按钮  清洗结束才出现//对表格的初始化
    ui->tableWidget_rinselog->setRowCount(0);// 设置表格行数
    ui->tableWidget_rinselog->setColumnCount(4);// 设置表格列数//添加表头内容
    QStringList tablehead;
    tablehead.append(tr("清洗模式"));
    tablehead.append(tr("开始时间"));
    tablehead.append(tr("结束时间"));
    tablehead.append(tr("总清洗时间"));
    ui->tableWidget_rinselog->setHorizontalHeaderLabels(tablehead);

    ui->tableWidget_rinselog->setShowGrid(true);//设置显示网格//表头风格
    ui->tableWidget_rinselog->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(189,255,253);""font:15pt;color: black;};");//设置表头第一行风格//表格内容风格
    ui->tableWidget_rinselog->setStyleSheet("background-color:rgb(255,255,255);""color: blue;");
    QFont font =ui->tableWidget_rinselog->font();
    font.setBold(false);//不加粗
    font.setFamily("PingFang SC Medium");
    ui->tableWidget_rinselog->setFont(font);//设置字体

    ui->tableWidget_rinselog->verticalHeader()->setHidden(true);//隐藏行号列

    ui->tableWidget_rinselog->resizeColumnsToContents();//表格所有列自动适应文本大小
    ui->tableWidget_rinselog->resizeRowsToContents();//表格所有行自动适应文本大小
    ui->tableWidget_rinselog->setEditTriggers(QAbstractItemView::NoEditTriggers);//    设置表格内容不可编辑
    ui->tableWidget_rinselog->horizontalHeader()->setResizeContentsPrecision(QHeaderView::Fixed);//设置表头不可拖动
    ui->tableWidget_rinselog->setSelectionMode(QAbstractItemView::NoSelection);//设置表格内容不可选
    ui->tableWidget_rinselog->horizontalHeader()->setStretchLastSection(true);//行头自适应表格
    ui->tableWidget_rinselog->horizontalHeader()->setFixedHeight(30);//设置表头高度
    ui->tableWidget_rinselog->verticalHeader()->setDefaultSectionSize(30);//设置行高度//ui->tableWidget_rinselog->setFrameShape(QFrame::StyledPanel);//设置边框跟单元格差不多//去除选中虚线框
    ui->tableWidget_rinselog->setFocusPolicy(Qt::NoFocus);//点击表时不对表头行光亮(获取焦点)
    ui->tableWidget_rinselog->horizontalHeader()->setHighlightSections(false);
    ui->tableWidget_rinselog->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//平均列宽,固定
    ui->tableWidget_rinselog->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);//垂直滚动条显示
    ui->tableWidget_rinselog->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);//水平滚动显示//设置纵向滚动条样式
        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;}");

    ui->tableWidget_rinselog->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);//设置滑动效果//设置手动滑动事件
        m_scrollBarV = ui->tableWidget_rinselog->verticalScrollBar();
        QObjectList objectList = ui->tableWidget_rinselog->children();for(int i =0; i < objectList.count(); i++){if(objectList.at(i)->objectName()=="qt_scrollarea_viewport"){
                objectList.at(i)->installEventFilter(this);}}//设置表格一直显示最后内容=========================在每次插入都要写这个  不然不会定位到最后
    ui->tableWidget_rinselog->scrollToBottom();//使用进度条表示写了多少
    ui->progressBar__tab->setRange(0,100);
    ui->progressBar__tab->setValue(0);
    ui->progressBar__tab->hide();}

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

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

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

//插入1行
   ui->tableWidget_rinselog->insertRow(ui->tableWidget_rinselog->rowCount());//尾插 依次往后//清洗模式  某行0列插入
   ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,0,newQTableWidgetItem(tr("强制冲洗")));//设置对齐  垂直和居中
   ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,0)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//开始时间
   QStringList split = ui->label_time->text().split(":");
   split.removeLast();
   endtime = split.at(0).toInt()*60+split.at(1).toInt();//总强制冲洗分钟
   QString add =QString("%1:%2").arg(split.at(0)).arg(split.at(1));;//静态变量只初始化一次 2022/1/1//开始时间只显示一次
   ui->tableWidget_rinselog->setItem(ui->tableWidget_rinselog->rowCount()-1,1,newQTableWidgetItem(tr("%1%2%3").arg(ui->label_date->text()).arg(" ").arg(add)));//设置对齐
   ui->tableWidget_rinselog->item(ui->tableWidget_rinselog->rowCount()-1,1)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
   ui->tableWidget_rinselog->hideRow(currRow);//隐藏行,读在表格时在显示//结束时间=系统时间+清洗总时间staticuint32_t totalmin = endtime+starttime;uint8_t hh =totalmin/60;uint8_t min =totalmin%60;
QString h ;
QString m;if(hh<10){
 h =QString("0%1").arg(hh);}else{
 h=QString("%1").arg(hh);}if(min<10){
 m =QString("0%1").arg(min);}else{
 m=QString("%1").arg(min);;}
currow = currRow;//不管在那种清洗模式  切换回来后还是这个清洗模式的行
rinsehh = h;//结束时间 小时
rinsemm = m;// 结束时间 分钟
rinsetotaltime = starttime;//总时间
ui->tableWidget_rinselog->showRow(currow);//显示行//结束时间
ui->tableWidget_rinselog->setItem(currow,2,newQTableWidgetItem(tr("%1 %2:%3").arg(ui->label_date->text()).arg(rinsehh).arg(rinsemm)));
ui->tableWidget_rinselog->repaint();//设置对齐
ui->tableWidget_rinselog->item(currow,2)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//总时间=ui->label_rinseleft的开始时间
ui->tableWidget_rinselog->setItem(currow,3,newQTableWidgetItem(tr("%1小时%2分钟").arg(rinsetotaltime/60).arg(rinsetotaltime%60)));
ui->tableWidget_rinselog->repaint();//设置对齐
ui->tableWidget_rinselog->item(currow,3)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
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
ui->tableWidget_rinselog->viewport()->update();//刷新内容
ui->tableWidget_rinselog->update();//刷新控件
ui->tableWidget_rinselog->show();
ui->widget_10->update();//刷新
ForcedRinseFlag =0;//不去后台看清洗日志直接写入文件,或者在清洗界面连续水洗LoadTabtoFileOrFileLoadtoTab("写入文件");

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

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

【7】QTabelWidget表格上下页

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

/*表格:系统日志和清洗日志处理槽函数的处理*/voidMainWindow::PB_SystemAndRinseLog(){
    QPushButton *button =qobject_cast<QPushButton *>(sender());if(button == ui->PB_updatetabl)//代码自动点击实现clik{//离线模式清洗自动停止开启的解决
            ui->tableWidget_rinselog->showRow(currow);//显示行//结束时间
            ui->tableWidget_rinselog->setItem(currow,2,newQTableWidgetItem(tr("%1 %2:%3").arg(ui->label_date->text()).arg(rinsehh).arg(rinsemm)));//设置对齐
            ui->tableWidget_rinselog->item(currow,2)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//总时间=ui->label_rinseleft的开始时间
            ui->tableWidget_rinselog->setItem(currow,3,newQTableWidgetItem(tr("%1小时%2分钟").arg(rinsetotaltime/60).arg(rinsetotaltime%60)));//设置对齐
            ui->tableWidget_rinselog->item(currow,3)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);

            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
            ui->PB_updatetabl->hide();LoadTabtoFileOrFileLoadtoTab("写入文件");}elseif(button == ui->PB_uppage)//上一页{
        ui->progressBar__tab->hide();
       pageflag=1;
       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){
             ui->progressBar__tab->hide();
            ui->tableWidget_rinselog->verticalScrollBar()->setValue(ui->tableWidget_rinselog->verticalScrollBar()->value()+520);}if(endflag ==false)//============作用:只在读取文件时进入{
            ui->progressBar__tab->show();
            QString readRowClumAlldata =LoadTabtoFileOrFileLoadtoTab("写入表格");if(readRowClumAlldata==""){qDebug()<<"readRowClumAlldata"<<readRowClumAlldata<<endl;
                    ui->tableWidget_rinselog->scrollToBottom();//滑动条最底部}uint64_t filesize =  datastorage.filesize;uint64_t filepos =  datastorage.filepossize;if(filesize ==filepos ){
                endflag =true;}int value =100-(filepos%filesize)%100;//qDebug()<<"filesize"<<filesize<<"filepos"<<filepos<<"value"<<value<<endl;
             data_lib->SendttyAT0(tr("【=====filesize======】%1【=====filepos=====】%2【====value====】").arg(filesize).arg(filepos).arg(value));
             ui->progressBar__tab->setValue(value);if(value ==100){
                     ui->progressBar__tab->setStyleSheet("color:red");
                     ui->progressBar__tab->update();}}}}

【8】QTabelWidget表格滑动事件Event

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){//记录按下的时间、坐标

           pressDateTime =QDateTime::currentDateTime();
           move_y  =QCursor::pos().y();
           press_y = move_y;

           animation->stop();}elseif(event->type()== QEvent::MouseButtonRelease){//鼠标放开,根据鼠标拖动的垂直距离和持续时间,设置窗口滚动快慢程度和距离if(animation->targetObject()!= m_scrollBarV){
               animation->setTargetObject(m_scrollBarV);
               animation->setPropertyName("value");}

           move_y =-1;
           release_y =QCursor::pos().y();qDebug()<<"MouseButtonRelease QCursor::pos().y()="<<QCursor::pos().y();
           QObject *parent_obj = watched->parent();if(parent_obj !=0|| parent_obj->inherits("QAbstractItemView")){QTimer::singleShot(150,(QAbstractItemView *)parent_obj
                                  ,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;
               pageStep =240;//scrollBarV->pageStep();qDebug()<<"pageStep="<<pageStep;if(mseconds > limit)//滑动的时间大于某个值的时候,不再滚动(通过增加分母){
                   mseconds = mseconds +(mseconds - limit)*20;}if(release_y - press_y >0){
                   endValue = m_scrollBarV->value()- pageStep *(200.0/ mseconds);//.0避免避免强制转换为整形if(scrollV_min > endValue){
                       endValue = scrollV_min;}}elseif(release_y - press_y <0){
                       endValue = m_scrollBarV->value()+ pageStep *(200.0/ mseconds);if(endValue > scrollV_max){
                           endValue = scrollV_max;}}if(mseconds > limit){
                   mseconds =0;//滑动的时间大于某个值的时候,滚动距离变小,减小滑动的时间}
               animation->setDuration(mseconds +550);
               animation->setEndValue(endValue);
               animation->setEasingCurve(QEasingCurve::OutQuad);
               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){
               endValue = scrollV_min;}if(endValue > scrollV_max){
               endValue = scrollV_max;}
           m_scrollBarV->setValue(endValue);qDebug()<<"endValue="<<endValue;qDebug()<<"move_distance="<<move_distance;
           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进行表格内容的长期存储”的评论:

还没有评论