qt中如何在QTableWidget中保存和加载数据
How to save and load data in QTableWidget in qt
我是 QT 的新手,我有一个应用程序,其中有一个 QTableWidget,我想向我的应用程序添加保存和加载选项。问题是如何在 QTableWidget 中保存和加载数据。我找到了这个页面:http://doc.qt.io/qt-5/qtwidgets-tutorials-addressbook-part6-example.html#defining-the-addressbook-class 但它不是 useful:I 尝试了这样的代码来保存:
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中保存和加载数据?
如有任何帮助,我们将不胜感激。
更正您的代码:
...
for(int ii=0;ii<ui->tableWidget->columnCount();ii++)
...
为此(在QTableWidget
中保存和加载数据)看Serialization with Qt,所以你需要考虑你到底想要什么Save/load(序列化)。由于 QVector
是可序列化的,我认为您的代码不会抱怨,但实际上它不会存储您的实际数据 QTableWidgetItems,因为该数据类型不在可序列化类型列表中 - 尝试直接保存单个项目你会知道会出现什么错误。此外,序列化 compound 类型(table 项的向量)可能不是正确的方法,即使两种类型都受支持。
为了解决您的问题,您需要序列化存储在 QTableWidget
项目中的任何数据,例如从项目中读取文本并存储...等等
感谢它已使用
修复
item.write(outstream);
我使用写入函数保存了每个项目,然后以相同的顺序使用读取函数 item.read(instream)
再次加载它。
我是 QT 的新手,我有一个应用程序,其中有一个 QTableWidget,我想向我的应用程序添加保存和加载选项。问题是如何在 QTableWidget 中保存和加载数据。我找到了这个页面:http://doc.qt.io/qt-5/qtwidgets-tutorials-addressbook-part6-example.html#defining-the-addressbook-class 但它不是 useful:I 尝试了这样的代码来保存:
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中保存和加载数据?
如有任何帮助,我们将不胜感激。
更正您的代码:
...
for(int ii=0;ii<ui->tableWidget->columnCount();ii++)
...
为此(在QTableWidget
中保存和加载数据)看Serialization with Qt,所以你需要考虑你到底想要什么Save/load(序列化)。由于 QVector
是可序列化的,我认为您的代码不会抱怨,但实际上它不会存储您的实际数据 QTableWidgetItems,因为该数据类型不在可序列化类型列表中 - 尝试直接保存单个项目你会知道会出现什么错误。此外,序列化 compound 类型(table 项的向量)可能不是正确的方法,即使两种类型都受支持。
为了解决您的问题,您需要序列化存储在 QTableWidget
项目中的任何数据,例如从项目中读取文本并存储...等等
感谢它已使用
修复item.write(outstream);
我使用写入函数保存了每个项目,然后以相同的顺序使用读取函数 item.read(instream)
再次加载它。