从 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 文档。这是处理二进制数据格式的类,因此当您编写int
s 时,您必须定义它的大小,以便可以在其他类型的机器上读取/写入相同的文件(例如,当代码编译为 x64 简单 int
是 64 位)。还有其他类型的问题,看文档就好了。
noooo,qint32 只是宏控制下的 typedef。您只需保证它在任何系统/编译器等上都是 32 位的(int 可以有不同的大小)。 qint32 n(model->rowCount())
等价于 qint32 n = model->rowCount()
,所以没有什么比标准 C++ 初始化更有趣的了..【参考方案2】:
您可以逐行、逐列浏览模型,并使用 CSV 等格式填充文件(逐行和由逗号或制表符分隔的列)。
但是,我认为在项目发生更改时修改文件不是一个好主意。您应该在应用程序关闭时编写该文件。
【讨论】:
【参考方案3】: 如果item(i,j)
为空,model->item(i,j)->write(stream);
将导致分段错误。在空单元格中分配一些虚拟值,例如空格。
【讨论】:
这帮助我解决了我遇到的一个问题,你是对的。你知道我应该如何将空格写入on_pushButton_Save_clicked
中的空白项吗?以上是关于从 QTableView 读取和写入文件的主要内容,如果未能解决你的问题,请参考以下文章