Russian Qt Forum

Qt => Model-View (MV) => Тема начата: TaleFrance от Март 06, 2021, 20:35



Название: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: TaleFrance от Март 06, 2021, 20:35
Здравствуйте! Прошу помочь с программой. Необходимо добавить возможность сохранения и загрузки таблицы из файла.

Код:
void MainWindow::on_Read_triggered()
{
    QString file_name = QFileDialog::getOpenFileName(this, "Open a file", "C:/files/myfile.txt", tr("Text Files (*.txt);;C++ Files (*.cpp *.h)"));

    // Проверяем, что имя файла не пустое
    if(!file_name.isNull())
    {// Создаём объект файла

            QFile file(file_name);
            if(file.open(QIODevice::ReadOnly))
            {

               QList<MyCard> card = _card.card();
                QDataStream dataStream1(&file);
               
                dataStream1.setVersion(QDataStream::Qt_4_1);

               dataStream1 >> card;
               
                   //ui->tableView->setModel(&_card);

                file.close();

              }
}

}

void MainWindow::on_Write_triggered()
{

   QString file_name = QFileDialog::getSaveFileName(this, "Open a file", "C:/files/myfile.txt");

    QFile file(file_name); // Создаём файл

    if(file.open(QIODevice::WriteOnly))  // ОТкрываем файл только для записи
    {
       QList<MyCard> card = _card.card();


        QDataStream dataStream2(&file);     // Создаём поток для записи данных


        dataStream2.setVersion(QDataStream::Qt_4_1);

         dataStream2 << card;     // Записываем данные
    }
    file.close();
}

........................................................................................

Перегрузка:

Код:
QDataStream&  operator<<(QDataStream&  stream, const MyCard& card)
{

    stream  <<  card._number  << card._name << card._sum
             << card._profit <<  card._rate<<card._balance;

    return stream;
}

QDataStream& operator>>(QDataStream& stream, MyCard& card)
{
    stream  >>  card._number  >> card._name >>  card._sum >> card._profit >>  card._rate>>card._balance;
    return stream;
}

На выходе (при сохранении в файл) в файле myfile.txt вместо чисел какие-то непонятные символы. Что это такое и как исправить? Как в таком случае обратно загружать таблицу из файла? Понятия не имею что делать. Подкиньте пожалуйста идеи.


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: demal от Март 06, 2021, 22:30
Самая просто идея это открыть кот эту книжку http://etextlib.ru/Book/Details/2905 и посмотреть пример.
На крайняк открыть http://qt-doc.ru/rabota-s-fajlami-direktoriyami-qt.html (http://qt-doc.ru/rabota-s-fajlami-direktoriyami-qt.html)
А вообще ты пишешь бинарный файл, а смотришь его как текстовый. Поэтому получаешь аброкадабру.
Для текста используй QTextStream, для двоичных файлов QDateStream  и всё будет в порядке.


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: TaleFrance от Март 07, 2021, 16:31
Получается, что данные лежат в QList и их надо вернуть в таблицу? Я получаю список для сериализации методом _card.card(). Т.е нужен обратный этому методу метод для заполнения таблицы из QList? Я только пока вообще не понимаю как такое реализовать. В примерах везде используется QTableWidget, а у меня QTableView.


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: demal от Март 07, 2021, 17:09
qtableView только отображает то, что находится у тебя в QList.
У qtableWidget данные хранятся в qtableWidgetItem. Тебе надо написать метод по заполнению qlist, а qtableView сам подтянет данные.
Алгоритм заполнения должен быть: добавить в список новый элемент, прочитать данные из файла, добавить данные в элемент.


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: TaleFrance от Март 07, 2021, 22:49
Спасибо, кстати, а так можно сделать?:
Код:
QDataStream in(&file);
QList<MyCard> card;

in >> card;
Т.е нужно придумать метод для заполнения таблицы из card?


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: demal от Март 07, 2021, 23:07
 Я не знаю твою задачу. Но хранить таблицу в qlist не самая лучшая идея, т.к. придется в рукопашную проецировать линейный qlist на двухмерную qtableview. если у тебя таблица не из одного стобца, то проще использовать qtablewidget - пусть он сам всё делает через qtablewidgetitem или использовать БД(sqlite). функционал по отображению у qtableview и qtablewidget одинаковый.
Если у тебя одна колонка, то возможно нужно использовать qlistview или что-то другое.


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: TaleFrance от Март 08, 2021, 08:50
Так по заданию нужно. Сказали работать с QList и QTableView. В этом то, видимо, и основная сложность лабы. Я чет хз только, как такое провернуть. Не понимаю, откуда подойти.


Название: Re: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла
Отправлено: TaleFrance от Март 08, 2021, 12:37
Вот так вроде работает:

Код:
QDataStream in(&file);
 in.setVersion(QDataStream::Qt_4_1);
Вот так вроде работает:
 
QList<MyCard> x;
in>>x;
if(!x.isEmpty())
{
    QMessageBox:: warning(this, "title", "ne pustoy");
}
_card.setCard(x);

Где :
void Card::setCard(const QList<MyCard> &card)
{
_card = card;
}