QT QtableView操作详解

article/2025/10/23 10:07:21

本文实现了使用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


http://chatgpt.dhexx.cn/article/UHjorvDr.shtml

相关文章

QTableView使用方法小结

本文总结了QTableView常用方法&#xff0c;包括常规的数据显示、表头设置、字体和颜色设置、行列的高宽&#xff0c;显示格式设置等&#xff0c;还有一套分页算法&#xff0c;在QTableView表格里插入QLineEdit、QPushButton、QCheckBox等控件&#xff0c;常用的qss设置&#xf…

Qt之QTableView的简单使用(含源码+注释)

文章目录 一、QTableView操作示例图二、QTableView&#xff08;个人理解&#xff09;三、源码CMainWindow.hCMainWindow.cpp 四、拓展&#xff1a;代理的使用总结相关文章 一、QTableView操作示例图 下图为QTableView简单使用示例图&#xff0c;其中包含设置、获取、新建item等…

QTableView 基本使用

一、简介 表格视图控件 QTableView&#xff0c;需要和 QStandardItemModel 配套使用&#xff0c;这套框架是基于 MVC 设计模式设计的&#xff0c;M(Model) 是 QStandardItemModel 数据模型不能单独显示出来。V(view) 是指 QTableView 视图&#xff0c;要来显示数据模型&#x…

QTableView详细使用说明

QTableView详细使用说明 创建QTableView表格标题设置表格的标题获取表格的标题 数据操作插入数据删除数据 属性设置设置表格的对齐方式设置表格的宽高设置表格的线属性 自定义菜单eventFilter方法重载eventFilter()启用事件监听实现事件过滤函数 设置菜单属性方法设置属性关联信…

web前端新手面试指南:自我介绍

面试时注意&#xff1a;自我介绍不能太长&#xff0c;也不能过短&#xff0c;3分钟左右最合适&#xff0c;尤其做为web前端技术方面的面试&#xff0c;更加要说到点上&#xff0c;我依次从学习方面、项目实践、未来规划这三个方面写下web前端面试的自我介绍。 您好&#xff0c;…

Web前端面试自我介绍对话技巧注意事项

大家在学会了web前端技术后&#xff0c;当然是要准备找一个适合自己的web前端工作了&#xff0c;那么面试环节是必不可少的&#xff0c;有一个良好的自我介绍表述&#xff0c;在HR心中也能加分不少&#xff0c;接下来小编就为大家介绍一下Web前端面试自我介绍对话技巧注意事项。…

前端面试自我介绍的技巧都有哪些?

前端面试自我介绍的技巧都有哪些? 在前端面试自我介绍的时候&#xff0c;可能会遇到两种情况&#xff1a;允许主动和不允许主动&#xff01; 允许主动的情况下&#xff0c;前端程序员应该详细的介绍自己技能树&#xff0c;结合工作经历&#xff0c;展示给面试官自己对项目和…

JVM coredump

JVM crash分析 Java程序运行的时候&#xff0c;遇到了coredump的现象。最后定位到时JIT导致的bug。 http://www.oracle.com/technetwork/java/javase/crashes-137240.html#gbyzu 这里记录下JVMcrash产生的文件怎么去定位问题&#xff0c;但是一般不会遇到crash&#xff0c;h…

coredump 使用总结

1. core dump简介&#xff1a; A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has terminated abnormally (crashed). In practice, other key pieces of program state are usually dumped…

【linux】coredump问题排查

序言 记录coredump问题的一些定位技巧 1. coredump简介 coredump称为核心转储&#xff0c;就是在进程异常时的一个快照&#xff0c;保存了异常时的内存、寄存器、堆栈等数据当进程接收到某些 信号 而导致异常退出时&#xff0c;就会生成 coredump 文件core文件是ELF文件格式…

Core Dump核心转储

核心转储&#xff08;core dump&#xff09;&#xff0c;在汉语中有时戏称为吐核&#xff0c;是操作系统在进程收到某些信号而终止运行时&#xff0c;将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。 概述 编辑 在UNIX系统中…

coredump文件的生成以及如何调试coredump文件?

生成coredump文件的相关配置 1. 首先通过 ulimit -a 命令&#xff0c;查看是否允许coredump文件生成; 如下图所示&#xff0c;core文件大小限制为0&#xff0c;即&#xff1a;不允许core文件生成 2. 使用 ulimit -c [kbytes] 命令更改core文件大小的限制 或者 通过 ulimit -c…

android生成coredump,详解coredump--全面

From: http://blog.csdn.net/tenfyguo/article/details/8159176 一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条…

coredump文件是如何生成的

目录 一、coredump 文件生成过程 二、coredump文件生成原理 1. 信号处理 do_signal() 2. 生成 coredump 文件 三、生产环境应该打开 coredump 功能吗&#xff1f; 人都会犯错&#xff0c;所以在编写程序时难免会出现 BUG。 有些 BUG 是业务逻辑上的错误导致的&#xff0c…

Coredump 详解

引言 当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff08;core文件&#xff09;&#xff0c;这种行为就叫做 Core Dump 或者叫做 ‘核心转储’&#xff0c;利用 coredump 可以帮助我们快速定位程序…

CoreDump追踪

当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff0c;这种行为就叫做Core Dump&#xff08;中文有的翻译成“核心转储”)。我们可以认为 core dump是“内存快照”&#xff0c;但实际上&#xff0c;除…

coredump详解

原文地址&#xff1a;https://blog.51cto.com/u_15471709/4868198 一&#xff0c;什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;并且在满…

linux之fping命令

fping检测主机是否存在,fping命令 fping类似于ping&#xff0c;但比ping强大。与ping要等待某一主机连接超时或发回反馈信息不同&#xff0c;fping给一个主机发送完数据包后&#xff0c;马上给下一个主机发送数据包&#xff0c;实现多主机同时ping&#xff0c;fping还可以在命令…

linux fping参数,linux下,fping命令与ping命令解析

ping Linux系统的ping命令是常用的网络命令&#xff0c;它通常用来测试与目标主机的连通性。 1.命令格式&#xff1a; ping [参数] [主机名或IP地址] 2.命令功能&#xff1a; ping命令用于&#xff1a;确定网络和各外部主机的状态&#xff1b;跟踪和隔离硬件和软件问题&#xf…

php fping,【Linux 命令】fping ping 包间隔时间详解

服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不懂,那就测吧: 先来-i: 间隔1s,没有生效.! 再试试-p OK,这个生效了,但-i 和-p的区别是…