Как и обещал:
mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QBoxLayout>
#include <QTableView>
#include <QStandardItemModel>
#include <QPushButton>
#include <QFile>
#define FILE_NAME "table.txt"
#define SEPARATOR '^'
class MainWindow : public QMainWindow
{
Q_OBJECT
QTableView *twTable;
QStandardItemModel *tableModel;
QHBoxLayout *buttonsLayout;
QPushButton *pbAdd;
QPushButton *pbDelete;
QPushButton *pbSave;
QPushButton *pbLoad;
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void pbAddClicked();
void pbDeleteClicked();
void pbSaveClicked();
void pbLoadClicked();
};
#endif // MAINWINDOW_H
mainwindow.cpp
Код:
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// Central widget
QWidget *CentralWidget1 = new QWidget(this);
// buttons layout
buttonsLayout = new QHBoxLayout();
pbAdd = new QPushButton("Add",CentralWidget1);
connect(pbAdd,SIGNAL(clicked()),this,SLOT(pbAddClicked()));
buttonsLayout->addWidget(pbAdd);
pbDelete = new QPushButton("Delete",CentralWidget1);
buttonsLayout->addWidget(pbDelete);
connect(pbDelete,SIGNAL(clicked()),this,SLOT(pbDeleteClicked()));
pbSave = new QPushButton("Save",CentralWidget1);
buttonsLayout->addWidget(pbSave);
connect(pbSave,SIGNAL(clicked()),this,SLOT(pbSaveClicked()));
pbLoad = new QPushButton("Load",CentralWidget1);
buttonsLayout->addWidget(pbLoad);
connect(pbLoad,SIGNAL(clicked()),this,SLOT(pbLoadClicked()));
// table
twTable = new QTableView(CentralWidget1);
tableModel = new QStandardItemModel(twTable);
QStringList horizontalHeader;
horizontalHeader.append("Ф.И.О");
horizontalHeader.append("Домашний адрес");
horizontalHeader.append("Номер телефона");
horizontalHeader.append("Дата рождения");
tableModel->setHorizontalHeaderLabels(horizontalHeader);
twTable->setModel(tableModel);
twTable->resizeColumnsToContents();
// main layout
QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->addWidget(twTable);
mainLayout->addLayout(buttonsLayout);
// Central widget
CentralWidget1->setLayout(mainLayout);
setCentralWidget(CentralWidget1);
}
MainWindow::~MainWindow()
{
}
void MainWindow::pbAddClicked(){
tableModel->insertRow(0);
for(int i=0;i<tableModel->columnCount();i++){
tableModel->setItem(0, i, new QStandardItem());
}
}
void MainWindow::pbDeleteClicked(){
QModelIndexList selectedCells = twTable->selectionModel()->selectedIndexes();
if(selectedCells.count()==1){
tableModel->removeRow(selectedCells.at(0).row());
}
}
void MainWindow::pbSaveClicked(){
QFile file(FILE_NAME);
if (file.open(QIODevice::WriteOnly)) {
int rows = tableModel->rowCount();
int cols = tableModel->columnCount();
QByteArray line;
for (int i=0; i<rows; i++){
line.clear();
line.append(tableModel->item(i,0)->text().toLocal8Bit());
for (int j=1;j<cols; j++){
line.append(SEPARATOR);
line.append(tableModel->item(i,j)->text().toLocal8Bit());
}
line.append("\r\n");
file.write(line);
}
file.close();
}
}
void MainWindow::pbLoadClicked(){
QFile file(FILE_NAME);
if (file.open(QIODevice::ReadOnly)){
QList<QByteArray> linesList;
QByteArray line;
while(!file.atEnd()){
line = file.readLine();
int chopCount=0;
for(int i=line.size()-1;i>=0;i--){
if(line.at(i)!='\r'&&line.at(i)!='\n') break;
chopCount++;
}
if(chopCount) line.chop(chopCount);
if(!line.isEmpty()){
linesList.append(line);
}
}
tableModel->setRowCount(linesList.count());
QList<QByteArray> rowValues;
for(int i=0;i<linesList.count();i++){
rowValues=linesList.at(i).split(SEPARATOR);
if(rowValues.count()!=tableModel->columnCount()){
tableModel->setRowCount(0);
return;
}
for(int j=0;j<rowValues.count();j++){
tableModel->setItem(i, j, new QStandardItem(QString::fromLocal8Bit(rowValues.at(j))));
}
}
twTable->resizeColumnsToContents();
file.close();
}else{
tableModel->setRowCount(0);
}
}
Название файла и разделитель в нем можно изменить:
Код:
#define FILE_NAME "table.txt"
#define SEPARATOR '^'
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).