实现功能:双击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找到了问题所在和解决方案