从 QTableView 读取和写入文件

Posted

技术标签:

【中文标题】从 QTableView 读取和写入文件【英文标题】:Read and write to a file from a QTableView 【发布时间】:2013-08-05 14:01:55 【问题描述】:

如何读取和写入文本文件日期输入到 QTableView?

这就是我所拥有的,但我想在将数据添加到表时保存数据,并且当然能够在重新打开应用程序时将其读回。有什么教程可以参考吗?

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    model = new QStandardItemModel();
    model->setRowCount(0);
    ui->tableView->setModel(model);


MainWindow::~MainWindow()

    delete ui;


void MainWindow::on_pushButton_clicked()

    QStandardItem *userName = new QStandardItem(ui->lineEdit_Name->text());
    QStandardItem *userNumber = new QStandardItem(ui->lineEdit_Number->text());

    QList<QStandardItem*> row;
    row <<userName << userNumber;

    model->appendRow(row);

非常感谢

编辑--------------------------------

这对我有用:

添加功能:

 void MainWindow::on_pushButto_Add_clicked() 
     QStandardItem *userInput = new QStandardItem(ui->lineEdit->text());
     QStandardItem *userInput2= new QStandardItem(ui->lineEdit_2->text());

     QList<QStandardItem*> row;
     row <<userInput << userInput2;

     model->appendRow(row); 

保存功能:

void MainWindow::on_pushButton_Save_clicked()

    QFile file("C:/Users/UserName/Practicing/Resources_Files/someFile.bin");

     if (file.open(QIODevice::WriteOnly))
     
         QDataStream stream(&file);
         qint32 n = model->rowCount();
         qint32 m = model->columnCount();
         stream << n << m;

         for (int i=0; i<n; ++i)
         
          for (int j=0; j<m; j++)
            
              model->item(i,j)->write(stream);
            
          
        file.close();
      

加载函数:

void MainWindow::on_pushButton_Load_clicked()


    QFile file("C:/Users/UserName/Practicing/Resources_Files/someFile.bin");
    if (file.open(QIODevice::ReadOnly))
    
       QDataStream stream(&file);
        qint32 n, m;
        stream >> n >> m;
        model->setRowCount(n);
        model->setColumnCount(m);

        for (int i = 0; i < n ; ++i) 
               for (int j = 0; j < m; j++) 
                   QStandardItem *item = new QStandardItem;
                   item->read(stream);
                   model->setItem(i, j, item);
               
           

     file.close();
    

【问题讨论】:

【参考方案1】:
QFile file("somefile.bin");

if (file.open(QIODevice::WriteOnly)) 
    QDataStream stream(&file);
    stream << *(model->invisibleRootItem());
    file.close();

http://qt-project.org/doc/qt-5.0/qtgui/qstandarditemmodel.html#invisibleRootItem


编辑:

这是更正(我已经检查过它是否有效)。

void MainWindow::save()

    QFile file("somefile.bin");
    if (file.open(QIODevice::WriteOnly)) 
        QDataStream stream(&file);
        qint32 n(model->rowCount()), m(model->columnCount());
        stream << n << m;

        for (int i=0; i<n; ++i)
            for (int j=0; j<m; j++)
                model->item(i,j)->write(stream);
        file.close();
    


void MainWindow::load()

    QFile file("somefile.bin");
    if (file.open(QIODevice::ReadOnly)) 
        QDataStream stream(&file);
        qint32 n, m;
        stream >> n >> m;

        model->setRowCount(n);
        model->setColumnCount(m);
        for (int i=0; i<n; ++i)
            for (int j=0; j<m; j++)
                model->item(i,j)->read(stream);
        file.close();
    

【讨论】:

非常感谢您的回复。如果我使用你建议的 sn-p,唯一可以保存的是这个符号“ˇ”(不带引号),知道我做错了什么吗? - 仅供参考 - 如果我更改流 invisibleRootItem());流式传输 好的,我假设这会递归地写入所有数据,但事实并非如此。 Docs 说“写入要流出的项目。只写入项目的数据和标志,而不写入子项目。” qt-project.org/doc/qt-5.0/qtgui/qstandarditem.html#write。这很容易解决。 成功了,非常感谢您的帮助!我将使用这段代码来更好地理解它是如何工作的。 阅读 QDataStream 文档。这是处理二进制数据格式的类,因此当您编写 ints 时,您必须定义它的大小,以便可以在其他类型的机器上读取/写入相同的文件(例如,当代码编译为 x64 简单 int是 64 位)。还有其他类型的问题,看文档就好了。 noooo,qint32 只是宏控制下的 typedef。您只需保证它在任何系统/编译器等上都是 32 位的(int 可以有不同的大小)。 qint32 n(model-&gt;rowCount()) 等价于 qint32 n = model-&gt;rowCount(),所以没有什么比标准 C++ 初始化更有趣的了..【参考方案2】:

您可以逐行、逐列浏览模型,并使用 CSV 等格式填充文件(逐行和由逗号或制表符分隔的列)。

但是,我认为在项目发生更改时修改文件不是一个好主意。您应该在应用程序关闭时编写该文件。

【讨论】:

【参考方案3】: 如果item(i,j) 为空,

model-&gt;item(i,j)-&gt;write(stream); 将导致分段错误。在空单元格中分配一些虚拟值,例如空格。

【讨论】:

这帮助我解决了我遇到的一个问题,你是对的。你知道我应该如何将空格写入on_pushButton_Save_clicked 中的空白项吗?

以上是关于从 QTableView 读取和写入文件的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件中读取和写入字符串

从文件中写入和读取列表

使用可序列化而不是向/从文件写入和读取对象

从文件 c++ 读取和写入的循环问题

java 从文件读取和写入数据

向/从映射文件 C++ 写入和读取