本文实现了使用QtableView控件来显示数据,数据源使用txt文本作为数据源,使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化,和对txt数据源的增删改查功能。

QT QtableView操作详解目录

1. 项目结构&软件界面

2. mainwindow.h文件

3. 构造函数

4. 打开文件

5. 实现监听事件

6. 初始化QtableView控件

7. 实现修改功能

8. 实现添加功能

9. 实现删除功能

10. 功能演示

雷总看了都说Nice的文章,看完记得点关注哈~


1. 项目结构&软件界面

2. mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStandardItemModel>
#include <QDebug>
#include <QFile>
#include <QMessageBox>
#include <QModelIndex>
#include <QFileDialog>
#include <functional>
#include <QItemSelectionModel>
//引入头文件
#include "mythread.h"//加入GBK申明,否则中文乱码 全局使用GBK文件操作因为有中文所以使用utf-8
#pragma execution_character_set("gbk")
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void ioDemo();    //初始化 删除修改添加之后也会调用初始化函数void deleteOnelineInFile(int nNumLine, QString &filename); //删除函数void DeleteOneline(int nNum, QString &strall);             //删除函数QLabel *LabCurFile;    //当前文件QLabel *LabCellPos;    //当前单元格行列号QLabel *LabCellText; //当前单元格内容/* 创建数据模型 */QStandardItemModel* model = new QStandardItemModel();QItemSelectionModel *theSelection; //选择模型private slots:void on_tableView_activated(const QModelIndex &index);void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_Button_File_clicked();//当前选择单元格发生变化void on_currentChanged(const QModelIndex &current, const QModelIndex &previous);void OnlineTreeViewDoubleClick(const QModelIndex & index);private:Ui::MainWindow *ui;//初始化mythread * thread;//update的行QString strUpItem="";
};
#endif // MAINWINDOW_H

3. 构造函数

    ui->setupUi(this);//构造函数thread = new mythread;  //分配空间//关联信号获取结束线程信号connect(thread, &mythread::isDone, this, &MainWindow::addSave);ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//不可编辑//ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中模式为选中行//ui->tableView->setSelectionMode( QAbstractItemView::SingleSelection);//设置选中单个//QTableWidget类似

4. 打开文件

void MainWindow::on_Button_File_clicked()
{/*//Button_File//定义文件对话框类QFileDialog *fileDialog = new QFileDialog(this);//定义文件对话框标题fileDialog->setWindowTitle(QStringLiteral("选中文件"));//设置默认文件路径fileDialog->setDirectory(".");//设置文件过滤器fileDialog->setNameFilter(tr("File(*.*)"));//设置可以选择多个文件,默认为只能选择一个文件QFileDialog::ExistingFilesfileDialog->setFileMode(QFileDialog::ExistingFiles);//设置视图模式fileDialog->setViewMode(QFileDialog::Detail);//打印所有选择的文件的路径QStringList fileNames;if (fileDialog->exec()) {fileNames = fileDialog->selectedFiles();qDebug()<<fileNames;}*///QFile writeFile("E:/QT/Creator/QT_MySQL/aa.txt"); //PATH是自定义写文件的地址QString fileName = QFileDialog::getOpenFileName(this,"文件对话框!",".","Text files (*.txt);;Any files (*)");ui->lineEdit_5->setText(fileName);//QString fileName = QFileDialog::getExistingDirectory(NULL,"caption",".");//ui->lineEdit_5->setText(fileName);//6. 初始化QtableView控件ioDemo();
}

5. 实现监听事件

监听鼠标点击单元格事件,用来在删除操作或者修改操作的时候获取选中的单元格进行操作。

第一个if是用来获取某一个单元格的X Y位置以及对应的Value值。

for 中的 3对应着 tableview的列,因为本文数据源有三列所以就直接写死了,后期需要可以设置两个全局变量代替。

最上方注释的代码是原型代码。

void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
{/*//原型代码//选择单元格变化时的响应if (current.isValid()){LabCellPos->setText (QString::asprintf ("当前单元格:%d 行,%d 列", current.row(),current.column()));QStandardItem* aItem=theModel->itemFromIndex(current);this->LabCellText->setText ("单元格内容:"+aItem->text());QFont font=aItem->font();ui->actFontBold->setChecked(font.bold());}*/if (current.isValid()){//LabCellPos->setText (QString::asprintf ("当前单元格:%d 行,%d 列", current.row(),current.column()));qDebug()<<"当前单元格:";qDebug()<<QString::number(current.row())<<" 行,";//qDebug()<<QString::number(current.column())<<" 列";QStandardItem* aItem=model->itemFromIndex(current);//this->LabCellText->setText ("单元格内容:"+aItem->text());qDebug()<<"单元格内容:"<<aItem->text();QFont font=aItem->font();qDebug()<<font.bold();//ui->actFontBold->setChecked(font.bold());}strUpItem="";for(int i=0;i<3;i++){QModelIndex rootIndex = ui->tableView->model()->index(current.row(), i);//最顶层item的indexQStandardItem* aItem=model->itemFromIndex(rootIndex);qDebug()<<"2.单元格内容:"<<aItem->text();strUpItem += aItem->text();}qDebug()<<"2.单元格所选内容:" << strUpItem;/*strUpItem="";for(int i=0;i<3;i++){QModelIndex rootIndex = ui->tableView->model()->index(-1, i);//最顶层item的indexQStandardItem* aItem=model->itemFromIndex(rootIndex);qDebug()<<"3.单元格内容:"<<aItem->text();strUpItem += aItem->text();}qDebug()<<"3.单元格所选内容:" << strUpItem;*/
}

6. 初始化QtableView控件

QAbstractItemView参考:Qt QStandardItemModel(1.超级详细用法)_双子座断点的博客-CSDN博客_qstandardmodel
    QAbstractItemView查找函数参考:Qt QStandardItemModel(2.超级详细函数)_双子座断点的博客-CSDN博客_qstandarditemmodel点击事件

修改样式参考:https://blog.csdn.net/QIJINGBO123/article/details/84186352

这块因为编码的问题所以全局默认bgk,在进行File文件操作的时候使用的是utf-8格式避免乱码。

下方数据模型设置部分需要添加函数可以点击QAbstractItemView查找函数进行参考查看

//初始化view
void MainWindow::ioDemo()
{QFile file(ui->lineEdit_5->text());ui->tableView->setModel(model);/* 设置表格标题行(输入数据为QStringList类型) */model->setHorizontalHeaderLabels({"学号", "姓名", "考试题目"});/* 自适应所有列,让它布满空间 */ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);if(! file.open(QIODevice::ReadOnly|QIODevice::Text))qDebug()<<file.errorString();elseqDebug()<<"openok";file.seek(0);QTextStream shuru(&file);shuru.setCodec("utf-8"); // 设置文件的编码格式为utf-8int ioInt=0;QString strID,strName,School;while(! shuru.atEnd()){QString line=shuru.readLine();qDebug()<<line;model->setItem(ioInt, 0, new QStandardItem(line.left(1)));model->setItem(ioInt, 1, new QStandardItem(line.mid(1,3)));model->setItem(ioInt, 2, new QStandardItem(line.mid(4,8)));ioInt++;}/* 设置表格视图数据 */ui->tableView->setModel(model);/* 显示 */ui->tableView->show();file.close();//数据模型theSelection = new QItemSelectionModel (model) ;//选择模型connect(theSelection,SIGNAL(currentChanged(QModelIndex,QModelIndex)), this,SLOT(on_currentChanged(QModelIndex,QModelIndex)));ui->tableView->setSelectionModel(theSelection); //设置选择模型ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);//ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选中模式为选中行ui->tableView->setSelectionMode ( QAbstractItemView::SingleSelection);//禁止选择多行}

7. 实现修改功能

在修改&添加&删除操作过程中需要小心 ‘\n’ 换行符,因为如果修改完数据多添加一个换行符会导致下次的操作行数+2。

如果进行删除操作的话,删除会导致数据删除换行符还有存留。

添加操作的话可能会导致添加完后再次添加可能会添加至下下行。

//修改某一行代码
void MainWindow::on_pushButton_3_clicked()
{QString strAll;QStringList strList;QFile readFile(ui->lineEdit_5->text());if(readFile.open((QIODevice::ReadOnly|QIODevice::Text))){//把文件所有信息读出来QTextStream stream(&readFile);stream.setCodec("utf-8"); // 设置文件的编码格式为utf-8strAll=stream.readAll();}readFile.close();QFile writeFile(ui->lineEdit_5->text());if(writeFile.open(QIODevice::WriteOnly|QIODevice::Text)){QTextStream stream(&writeFile);stream.setCodec("utf-8"); // 设置文件的编码格式为utf-8strList=strAll.split("\n");           //以换行符为基准分割文本for(int i=0;i<strList.count();i++)    //遍历每一行{//strUpItem 全局变量,在鼠标选中行后自动获取valueif(strList.at(i).contains(strUpItem)){if(i==strList.count()-1){QString tempStr=strList.at(i);tempStr.replace(0,tempStr.length(),ui->lineEdit_4->text());   //"Hello!"是要替换的内容stream<<tempStr<<'\n';}else{QString tempStr=strList.at(i);tempStr.replace(0,tempStr.length(),ui->lineEdit_4->text());   //"Hello!"是要替换的内容stream<<tempStr<<'\n';}}//如果没有找到要替换的内容,照常写入else{if(i==strList.count()-1){stream<<strList.at(i);}else{stream<<strList.at(i)<<'\n';//添加<<'\n'换行}}}}writeFile.close();ioDemo();
}

8. 实现添加功能

void MainWindow::on_pushButton_clicked()
{QFile file(ui->lineEdit_5->text());QString n1;if (file.open(QIODevice::ReadWrite | QIODevice::Append)){QTextStream txtOutput(&file);txtOutput.setCodec("utf-8"); // 设置文件的编码格式为utf-8n1="\n"+ui->lineEdit->text()+" "+ui->lineEdit_2->text()+" "+ui->lineEdit_3->text();txtOutput << n1 << endl;file.close();}file.close();ioDemo();
}

9. 实现删除功能

//删除某一行数据
void MainWindow::on_pushButton_2_clicked()
{QString str=ui->lineEdit_5->text();deleteOnelineInFile(ui->tableView->currentIndex().row(),str);//重新初始化视图ioDemo();//删除多行/*出自https://blog.csdn.net/qq_40450386/article/details/82904934QItemSelectionModel *model_selection = ui->tableView->selectionModel();QModelIndexList IndexList= model_selection->selectedIndexes();QMap<int,int>rowMap;foreach (QModelIndex index, IndexList){//处理略  ...  可以读取、修改其内容;}上面代码中QModelIndexList记录的是所有选中的item的index,而不是行的index,不管你的选中模式是行还是item;如果想对整行处理的话,需要避免对同一行多次操作;比如可以index.column()==0时进行操作处理;如果删除选中的多行,更需要当心进坑!model.removeRow(row)之后,之后的行号就变了(减少1),可不幸的是,选中记录里的行号没有变化,还是原来的行号,再进行删除就删错行了。(比如,要删除2,4行,删了第2行后,原来的第4行变成了第3行,可是你删除的还是记录里的第4行!)所以删除多个行时,要从后往前删除,先删除行号大的,对小的没影响。可以用Qmap记录删除的行,因为他是排序的,省去麻烦删除多行完整代码如下:QItemSelectionModel *model_selection = ui->tableView->selectionModel();QModelIndexList IndexList= model_selection->selectedIndexes();QMap<int,int>rowMap;foreach (QModelIndex index, IndexList){if(! index.isValid()) return;if(index.column()!=0) continue;rowMap.insert(index.row(),0);}QMapIterator<int,int> Iterator(rowMap);Iterator.toBack();while(rowMapIterator.hasPrevious()){rowMapIterator.previous();int rowm=rowMapIterator.key();qDebug()<<"del row..."<<rowm;file_model->removeRow(rowm);}*/
}void MainWindow::deleteOnelineInFile(int nNumLine, QString &filename)
{//删除model中的一行视图数据model->removeRow(nNumLine);QString strall;QFile readfile(filename);if(readfile.open(QIODevice::ReadOnly)){QTextStream stream(&readfile);strall=stream.readAll();}readfile.close();DeleteOneline(nNumLine, strall);//删除File文件内的某一行数据QFile writefile(ui->lineEdit_5->text());if(writefile.open(QIODevice::WriteOnly)){QTextStream wrtstream(&writefile);// --\nwrtstream << strall;}writefile.close();
}void MainWindow::DeleteOneline(int nNum, QString &strall)
{int nLine=0;int Index=0;//算出行数nLinewhile(Index!=-1){Index=strall.indexOf('\n',Index+1);nLine++;}//如果是直接从位置0开始删除\n算一个字符"abc\nme\ndo" \n的index是3要删除3+1个字符,即index+1个if(nNum==0){int nIndex=strall.indexOf('\n');strall.remove(0,nIndex+1);}else{int nTemp=nNum;int nIndex=0,nIndex2=0;while(nTemp--){//nIndex=strall.indexOf('\n',nIndex+1);//这里会更新nIndexif(nIndex!=-1)//说明是有效的{nIndex2=strall.indexOf('\n',nIndex+1);}}//删除的行不是最后一行(从nIndex+1这个位置起nIndex2-nIndex个字符全部抹去)if(nNum<nLine-1){strall.remove(nIndex+1, nIndex2-nIndex);//不用减一}//删除的是最后一行(从nIndex起始len-nIndex个字符全抹去)//不能从nIndex+1处开始,else if(nNum==nLine-1){int len=strall.length();strall.remove(nIndex,len-nIndex);}else{}}
}

10. 功能演示

本文代码就不放出来了,自己加油加油照着做就可以做出来了。

本文借鉴参考: Qt QStandardItemModel用法(超级详细),其它博客就别瞎看了,参考作者的文章和C语言网的这篇文章是最正确的。

雷总看了都说Nice的文章,看完记得点关注哈~

其它文章 :

QT TextEdit控件_双子座断点的博客-CSDN博客_qt textedit

QT QComboBox使用详解_双子座断点的博客-CSDN博客

QT QtableView操作详解_双子座断点的博客-CSDN博客_qtableview增删改查

Qt QStandardItemModel(1.超级详细用法)_双子座断点的博客-CSDN博客_qstandardmodel

Qt QStandardItemModel(2.超级详细函数)_双子座断点的博客-CSDN博客_qstandarditemmodel点击事件

QT QRadioButton使用详解_双子座断点的博客-CSDN博客_qt radiobutton

QT QLineEdit使用详解_双子座断点的博客-CSDN博客_qt qlineedit

Qt QMessageBox使用详解_双子座断点的博客-CSDN博客_qt message

QChart折线图、饼状图、条形图、曲线图_双子座断点的博客-CSDN博客_qchart样式

QChart属性详解_双子座断点的博客-CSDN博客_setanimationoptions

QCharts QValueAxis使用_双子座断点的博客-CSDN博客_qvalueaxis

Qt 5 等待提示框(开源 动态图)_双子座断点的博客-CSDN博客_qt 等待对话框

QtDataVisualization 数据3D可视化_双子座断点的博客-CSDN博客_qtdatavisualization

QT QLabel控件(使用详解)_双子座断点的博客-CSDN博客_qt label

QT QtableView操作详解相关推荐

  1. Qt QFile文件操作详解

    Qt QFile文件操作详解 很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写.创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 WPS Office.PDFedit 等 ...

  2. Qt pro 文件详解

     Qt pro 文件详解 1. TEMPLATE  变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件.Qmake  工具定义了5种模板:   a. 应用 ...

  3. qstring如何初始化_学习QT之QString详解

    学习QT之QString详解 QString类保存16位Unicode值,提供了丰富的操作.查询和转换函数.该类还进行了使用隐式共享.高效的内存分配策略等多方面的优化. 一.字符串常用操作 字符串的操 ...

  4. QT Echarts 使用详解(一)ECharts下载\示例\动态缩放

    Echarts是百度的一款可视化界面开发的平台,里面的地图以及数据可视化内容十分丰富,适合用于一些大屏数据显示项目或者一些ui界面开发.每一个ECharts图表使用一个无边框的QWebView来展示, ...

  5. python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解

    本文实例讲述了Python基于Tensor FLow的图像处理操作.分享给大家供大家参考,具体如下: 在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数 ...

  6. 第 5 章 Nova - 041 - Resize Instance 操作详解

    Resize Instance 操作详解 Resize 的作用是调整 instance 的 vCPU.内存和磁盘资源. Instance 需要多少资源是定义在 flavor 中的,resize 操作是 ...

  7. SVN的Windows和Linux客户端操作详解

    SVN的Windows和Linux客户端操作详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Windows客户端操作 1.安装SVN客户端 a>.去官网下载svn软件 ...

  8. python对输入的字符串进行解析_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  9. countif和sum套用_if函数嵌套countif、sumif函数实例操作详解 你需要学习了

    excel中if函数嵌套countif函数实例操作详解,需要了解if函数.countif函数.sumif函数字符串引用方式,isblank函数 操作方法 01 用扫描枪连接excel后将自动将货物名称 ...

最新文章

  1. 在Mac上设置环境变量并永久生效的方法
  2. 【kafka】confluent_kafka重置offset
  3. Linux更换python版本 (转载)
  4. Dubbo 线上调服务方法空指针问题
  5. 推荐 12 个好用的 React 的开源项目,开发效率又能提升了!
  6. DAO模式多表联查案例
  7. C++中的野指针问题
  8. 服务器能进系统滴滴响,ibm x226服务器开机嘀嘀嘀响三遍就没反应了。是怎么回事?内存吗?...
  9. 【从线性回归到BP神经网络】第一部分:协方差与相关系数
  10. 远程文件传输工具Filezilla
  11. java代码计算两个时间相差的天数:
  12. 800家电子元器件供应商及代理商
  13. Mongodb 监控安装配置
  14. python微信小程序 java电子书阅读器系统uniapp
  15. springboot+jpa+mysql Springboot+jpa+jdbc+sqlserver 使用时遇到的一系列的问题
  16. 基于Linux 5.4.18的nvme驱动学习 - Linux相关概念 (一)
  17. springboot如何解析邮箱
  18. SpringBoot项目发布与部署,及使用花生壳映射项目
  19. 在线抽签html,简易抽签程序(数字滚动 HTML + JavaScript)
  20. 访问管理未来的四大趋势

热门文章

  1. 发布《区块链创新与知识产权发展白皮书》
  2. 博客园博客背景图片设置
  3. 运行浏览器无痕模式报错
  4. autoCAD数据库读写
  5. 使用高德JS-API进行基于LBS的开发-地图初始化地图控件
  6. Template by 2015ljn
  7. linux目录和链接的区别,Linux 下软链接和硬链接的区别
  8. 剖析Unreal Engine超真实人类的渲染技术Part 3 - 毛发渲染及其它
  9. 个人电脑详细的安全设置方法
  10. Framework学习之旅:Zygote进程