赞
踩
实现功能:双击tablewidget中的一行内容,弹出确认对话框并实现删除功能
在实现这个功能过程中,我遇到了两个问题:
1.怎么读取文件的所有内容?
2.怎么通过点击的方式访问到具体哪些要删除的内容?
在ChatGPT的帮助下解决了问题
不得不说GPT真是个好东西
解决方法如下:
问题1:
1.通过QTextStream读取整个文件的文本内容;
2.用QString读取文本
3.用QStringList接收QStiring的文本,并用QString的.split("\n")识别出文本中的每一行
问题2:
1.用QTableWidget的on_tableWidget_cellDoubleClicked(int row, int column)获取到选中的行row
2.再通过row实现再QStringList中要删除内容的定位
代码如下
- void Del::on_tableWidget_cellDoubleClicked(int row, int column)
- {
- int p = QMessageBox::warning(this, "删除", "确定删除本书籍?", QMessageBox::Yes, QMessageBox::No);
- if (p == QMessageBox::Yes)
- {
- // 读取原始数据
- QFile file("./book.txt");
- if (!file.open(QIODevice::ReadWrite))
- {
- qDebug() << "Failed to open file for reading and writing";
- return;
- }
-
- QTextStream in(&file);
- QString stmp = in.readAll();//储存原文件的所有文本内容
- file.close();
-
- // 将要删除的行从数据中移除
- QStringList lines = stmp.split("\n");
- if (row*4 + 3 < lines.size())
- {
- lines.removeAt((4*row));
- lines.removeAt((4*row));
- lines.removeAt((4*row));
- lines.removeAt((4*row));
- stmp = lines.join("\n");
- }
- else
- {
- qDebug() << "Invalid row number or insufficient lines to delete";
- return;
- }
- // 将修改后的数据写入文件
- QFile writeFile("./book.txt");
- if (!writeFile.open(QIODevice::WriteOnly))
- {
- qDebug() << "Failed to open file for writing";
- return;
- }
-
- QTextStream wrtStream(&writeFile);
- wrtStream << stmp;
- writeFile.close();
-
- // 更新表格视图
- ui->tableWidget->removeRow(row);
- }
- }
-
值得一提的是:
在实现删除这一功能的过程中,我犯了一个低级错误
一开始理解错了删除“book类四个内容",把代码写成了
lines.removeAt((4*row));
lines.removeAt((4*row+1));
lines.removeAt((4*row+2));
lines.removeAt((4*row+3));在removeAt的时候其实就已经对lines进行修改了,这样写导致了删除之后的访问越界,出现了这样的报错
通过寻找路径找到了Line:768是.removeAt的内部函数,并用GPT找到了问题所在和解决方案
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。