Russian Qt Forum
Ноябрь 22, 2024, 10:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Файловый ВВОД-ВЫВОД. СОХРАНЕНИЕ и ЗАГРУЗКА таблицы из файла  (Прочитано 5312 раз)
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« : Март 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 вместо чисел какие-то непонятные символы. Что это такое и как исправить? Как в таком случае обратно загружать таблицу из файла? Понятия не имею что делать. Подкиньте пожалуйста идеи.
Записан
demal
Чайник
*
Offline Offline

Сообщений: 53


Просмотр профиля
« Ответ #1 : Март 06, 2021, 22:30 »

Самая просто идея это открыть кот эту книжку http://etextlib.ru/Book/Details/2905 и посмотреть пример.
На крайняк открыть http://qt-doc.ru/rabota-s-fajlami-direktoriyami-qt.html
А вообще ты пишешь бинарный файл, а смотришь его как текстовый. Поэтому получаешь аброкадабру.
Для текста используй QTextStream, для двоичных файлов QDateStream  и всё будет в порядке.
Записан
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #2 : Март 07, 2021, 16:31 »

Получается, что данные лежат в QList и их надо вернуть в таблицу? Я получаю список для сериализации методом _card.card(). Т.е нужен обратный этому методу метод для заполнения таблицы из QList? Я только пока вообще не понимаю как такое реализовать. В примерах везде используется QTableWidget, а у меня QTableView.
Записан
demal
Чайник
*
Offline Offline

Сообщений: 53


Просмотр профиля
« Ответ #3 : Март 07, 2021, 17:09 »

qtableView только отображает то, что находится у тебя в QList.
У qtableWidget данные хранятся в qtableWidgetItem. Тебе надо написать метод по заполнению qlist, а qtableView сам подтянет данные.
Алгоритм заполнения должен быть: добавить в список новый элемент, прочитать данные из файла, добавить данные в элемент.
Записан
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #4 : Март 07, 2021, 22:49 »

Спасибо, кстати, а так можно сделать?:
Код:
QDataStream in(&file);
QList<MyCard> card;

in >> card;
Т.е нужно придумать метод для заполнения таблицы из card?
Записан
demal
Чайник
*
Offline Offline

Сообщений: 53


Просмотр профиля
« Ответ #5 : Март 07, 2021, 23:07 »

 Я не знаю твою задачу. Но хранить таблицу в qlist не самая лучшая идея, т.к. придется в рукопашную проецировать линейный qlist на двухмерную qtableview. если у тебя таблица не из одного стобца, то проще использовать qtablewidget - пусть он сам всё делает через qtablewidgetitem или использовать БД(sqlite). функционал по отображению у qtableview и qtablewidget одинаковый.
Если у тебя одна колонка, то возможно нужно использовать qlistview или что-то другое.
Записан
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #6 : Март 08, 2021, 08:50 »

Так по заданию нужно. Сказали работать с QList и QTableView. В этом то, видимо, и основная сложность лабы. Я чет хз только, как такое провернуть. Не понимаю, откуда подойти.
Записан
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #7 : Март 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;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.