如何在qt中的QTableWidget中保存和加载数据

Posted

技术标签:

【中文标题】如何在qt中的QTableWidget中保存和加载数据【英文标题】:How to save and load data in QTableWidget in qt 【发布时间】:2018-07-18 07:24:24 【问题描述】:

我对 QT 很陌生,我有一个应用程序,其中有一个 QTableWidget,我想为我的应用程序添加保存和加载选项。问题是如何在 QTableWidget 中保存和加载数据。我找到了这个页面:http://doc.qt.io/qt-5/qtwidgets-tutorials-addressbook-part6-example.html#defining-the-addressbook-class 但它没有用:我尝试了这样的代码来保存:

void training::on_pushButton_3_clicked()

    QVector<QTableWidgetItem*> outvector;
    for(int i = 0;i<ui->tableWidget->rowCount();i++)
        for(int ii=0;i<ui->tableWidget->columnCount();ii++)
            outvector.append(ui->tableWidget->item(i,ii));
    QString path = QFileDialog::getSaveFileName(this,QString("Save file     path"),"",QString("table (*.tbl);;All Files (*)"));
    if(path.isEmpty())
        return;
    else
        QFile file(path);
        if(!file.open(QIODevice::WriteOnly))
            QMessageBox::information(this,"Error",file.errorString());
            return;
        
        else
            QDataStream out(&file);
            out.setVersion(QDataStream::Qt_5_11);
            out<<outvector;
        
    

是这样吗?!如果可行,如何再次加载信息;如果不是如何在 tablewidget 中保存和加载数据?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

对您的代码进行此更正:

...
for(int ii=0;ii<ui->tableWidget->columnCount();ii++)
...

为此(在QTableWidget 中保存和加载数据)查看Serialization with Qt,因此您需要考虑到底要保存/加载(序列化)什么。由于QVector 是可序列化的,我认为您的代码不会抱怨,但实际上它不会存储您的实际数据QTableWidgetItems,因为该数据类型不在可序列化类型列表中 - 尝试直接保存单个项目并且您会知道会出现什么错误。此外,序列化 compound 类型(表格项的向量)可能不是正确的方法,即使两种类型都支持。

为了解决您的问题,您需要序列化您存储在 QTableWidget 项目中的任何数据,例如从项目中读取文本并存储...等。

【讨论】:

【参考方案2】:

感谢使用

item.write(outstream);

我使用写入函数保存了每个项目,然后以相同的顺序使用读取函数item.read(instream) 再次加载它。

【讨论】:

以上是关于如何在qt中的QTableWidget中保存和加载数据的主要内容,如果未能解决你的问题,请参考以下文章

Qt 学习笔记 10.QTableWidget

如何防止用户使用 Python 和 Qt 在 QtableWidget 中移动列的大小?

QT如何获取QTableWidget表格中的高亮位置的行数?

QT中的QtableWidget和QtableView使用有啥区别?

Qt:在委托绘制事件中渲染时如何增加 QTablewidget?

Qt怎么把QTableWidget表格中的数据读取出来