Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2015, 06:40   #21
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Как и обещал:

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 '^'
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 09.07.2015, 18:17   #22
Evolnov
Новичок
Джуниор
 
Регистрация: 08.07.2015
Сообщений: 11
По умолчанию

Большое спасибо!
Evolnov вне форума Ответить с цитированием
Старый 09.07.2015, 18:30   #23
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Пожалуйста.

Если есть какие-то вопросы, спрашивайте.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на знание циклов. pavldaps Помощь студентам 0 07.10.2012 20:13
Задача на массивы и знание типов данных Alexey_kor Помощь студентам 4 09.04.2011 00:18
Знание - сила! Vado Свободное общение 17 22.04.2010 21:31
проверка на знание C pproger Свободное общение 19 23.02.2010 08:39