QT-删除原文件的多行内容

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

上一篇:C++知识点总结(27):链表-二、引用符


下一篇:MFC(二)集成基础控件