CF
Cause Fiction24 июля 2020 г. 2:47

Qt + БД + TableModel

бд, Qt

Всем доброго дня, недавно закончил курс по базам данных, сразу же захотел применить их в своей учебной программке.

Цель следующая - есть мой подкласс таблицы от QAbstractTableModel, который помещается на QTableView. В программе есть кнопка - Сохранить, до этого данные сохранялись в txt, как можно сделать, что-бы они сохранялись в базе данных, с возможностью потом загрузить? К примеру используя SQLite.
Интересует больше всего - как правильнее обратиться к созданному файлу БД при загрузке данных из него? Надо ли указывать путь до этого файла, и где?
Правильно ли вообще использовать QAbstractTableModel, или здесь правильнее QSqlTableModel ?
Если что я новичок, буду благодарен за простые и подробные ответы.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

8
Evgenii Legotckoi
  • 24 июля 2020 г. 13:09

Добрый день.

Вы можете забрать все данные из своей модели, которая наследована от QAbstractTableModel, и сохранить все данные прямым запросом. Также можно использовать и QSqlTableModel.

Учитывая, что вы новичёк, то возможно вам стоит просто ознакомиться с какими-то статьями, которые здесь на сайте присутствуют.

Могу вам предложить посмотреть вот эти статьи, чтобы вы составили общее представление по работе с базами данных в Qt

    ИП
    • 24 июля 2020 г. 13:44

    При установке Qt в комплекте как правило идут примеры, в том числе там есть несколько примеров использования SQLite. Думаю если Вы справились с QAbstractTableModel + сохранением в файл и знаете что такое SQLite, то сразу все станет понятно.

      CF
      • 25 июля 2020 г. 0:51
      • (ред.)

      Спасибо, правильно ли я мыслю, что если использовать подкласс QAbstractTableModel, то при сохранении данных в БД можно создать в ней таблицу на 3 столбца: (значение ячейки, строка, столбец) и сохранять туда ненулевые значения из программы ?
      И еще, как можно обратиться к моей БД для выгрузки данных из нее?

        Evgenii Legotckoi
        • 25 июля 2020 г. 2:26

        Если таблица не создана в базе данных, то её предварительно нужно создать. Я вам дал ссылки на статьи, в них используется класс DataBase, в котором есть пример кода для создания таблиц в базе данных SQLite, если таблицы ещё не существуют.
        Для редактирования данных в таблицах моно использовать QSqlTableModel.
        Что касается вопроса о выгрузке файлов из базы данных, то вы уверены, что там именно файлы хранятся? Может эти файлы ещё генерировать нужно из сщуествующих таблиц?

        И еще, как можно обратиться к моей БД для выгрузки файлов из нее?

        Этот ваш последний вопрос может потянуть по объяснению на несколько страниц текста и примеров програмного кода ого-го насколько.
        И при этом высока вероятность, что ответ окажется не тем, что предполагалось в сути вопроса.

        Просто начните что-то делать для начала. Создайте базу данных или подключитесь к существующей и отобразите таблицу.

          CF
          • 25 июля 2020 г. 2:35
          • (ред.)

          Простите, я опечатался на счет файлов, хотел написать "данных". Я уже создал таблицу в БД, и сохраняю туда обычные значения. В папке сборки проекта создался файл my_DB.sqlite, и там есть моя таблица со всеми значениями. Вопрос в том, как в коде обратиться к этому файлу, что-бы получить мои данные обратно? (если я не использую QSqlTableModel)

          В статье нашел этот метод, это общий случай обращения к файлу БД ?

          bool DataBase::openDataBase()
          {
              /* База данных открывается по заданному пути
               * и имени базы данных, если она существует
               * */
              db = QSqlDatabase::addDatabase("QSQLITE");
              db.setHostName(DATABASE_HOSTNAME);
              db.setDatabaseName("C:/example/" DATABASE_NAME);
              if(db.open()){
                  return true;
              } else {
                  return false;
              }
          }
          
            Evgenii Legotckoi
            • 25 июля 2020 г. 2:40

            Вопрос в том, как в коде обратиться к этому файлу, что-бы получить мои данные обратно?

            Если вы хотите отобразить эти данные в виде таблице, то воспользуйтесь QSqlTableModel

            Вот я уже давал ссылку на статью Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

            Я много времени тогда потратил, пока подготавливал её и писал. Не хочу повторяться.

            В той статье вам нужно внимательно просмотреть класс DataBase, в котором показано, как подключиться к базе данных SQLite.
            А также посмотрите, как работать с самой QSqlTableModel и QTableView, чтобы отобразить данные.

            Если вы как-то ещё хотите получать данные, и как-то иначе с ними работать, а не только в таблице, то уточните.

            Вопрос в том, как в коде обратиться к этому файлу, что-бы получить мои данные обратно?

            Но по факту в той статье есть ответ на этот вопрос. Он в классе DataBase. Там показано подключение к базе данных.

              Evgenii Legotckoi
              • 25 июля 2020 г. 2:48

              Это пример кода, вам нужно будет модифицировать путь, по которому находится база данных и название файла.
              Это пример, поэтому путь к базе данных гвоздями прибит. Но потом, как разберётесь, сможете сделать и относительный путь и получение пути к файлу через файловый диалог

                CF
                • 25 июля 2020 г. 6:47

                Хорошо, большое спасибо

                  Комментарии

                  Только авторизованные пользователи могут публиковать комментарии.
                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                  Ua

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:84баллов,
                  • Очки рейтинга4
                  Ua

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:42баллов,
                  • Очки рейтинга-8
                  ОК

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:47баллов,
                  • Очки рейтинга-6
                  Последние комментарии
                  ИМ
                  Игорь Максимов22 ноября 2024 г. 21:51
                  Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  Evgenii Legotckoi
                  Evgenii Legotckoi31 октября 2024 г. 23:37
                  Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  A
                  ALO1ZE19 октября 2024 г. 17:19
                  Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь Максимов5 октября 2024 г. 16:51
                  Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas55 июля 2024 г. 20:02
                  QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  Сейчас обсуждают на форуме
                  f
                  firstlunoxod15 февраля 2025 г. 13:46
                  Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                  Дмитрий
                  Дмитрий3 февраля 2025 г. 16:24
                  Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                  NW
                  Nayo Wai30 января 2025 г. 19:22
                  не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                  n
                  nkly3 января 2025 г. 12:52
                  Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                  M
                  Marsel17 августа 2023 г. 0:26
                  OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                  Следите за нами в социальных сетях