【问题标题】:Read and write to a file from a QTableView从 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();
    }
}

【问题讨论】:

    标签: qt qtableview qstandarditemmodel qmodelindex


    【解决方案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 中的空白项吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多