Чтение и запись в файл из QTableView
Как я могу читать и писать в текстовый файл, ввод даты в 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();
}
}
3 ответа
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
Редактировать:
Вот исправление (я проверил, что это работает).
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();
}
}
Вы можете просматривать вашу модель строка за строкой, столбец за столбцом и заполнять файл в формате, подобном CSV (строка за строкой и столбцы, разделенные запятой или табуляцией).
Но я не думаю, что это хорошая идея, чтобы изменить файл, когда элемент изменился. Вы должны написать файл, когда ваша заявка закрыта.
model->item(i,j)->write(stream);
приведет к ошибке сегментации, если item(i,j)
пустой. Назначьте какое-нибудь фиктивное значение, например, пробел в пустых ячейках.