Реклама

Поиск

Qt/C++ - Урок 005. QSqlRelationalTableModel - Работаем со связными таблицами

TutorialQtQSqlRelationalTableModel, QSqlRelationalTableModel example, qt, qt таблицы, sql, sqlite365

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

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

В данной статье рассматривается вариант из двух таблиц. В одной из таблиц содержится информация об устройствах (Имя хоста и IP адрес), а во второй таблице ID этих устройств, по которым в второй таблице будут подставляться Имя хоста и IP адрес соответственно устройствам.

Структура проекта для QSqlRelationalTableModel

Структура проекта

Проект для этого урока является доработанной версией предыдущей статьи и остается неизменной.

Qt/C++ - Урок 013. QMenu - контекстное меню в QTableView

TutorialQtQMenu, QMenu example, QMenu Qt, Qt, контекстное меню, меню393

Для работы с контекстным меню в Qt используется класс QMenu . При совершении действий, которые должны вызвать меню, вызывается обработчик, который создаёт меню и привязывает обработчики к действиям в данном меню.

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

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для QMenu

Структура проекта остается неизменной, как и в уроке, на котором основывается данный урок. Изменениям в программном коде будут подвергнуты лишь два файла:

  • mainwindow.h
  • mainwindow.cpp

Реклама

Qt/C++ - Урок 008. QDataWidgetMapper - Работа с базой данных через виджет

TutorialQtmapper, QDataWidgetMapper, QDataWidgetMapper example, QSqlTableModel, qt, sql382

Для отображения данных в виджет с произвольной формой используется класс QDataMapperWidget . Для работы с этим виджетом по-прежнему требуется модель, для представления данных.

Например, QSqlTableModel или QSqlRelationalTableModel , но данные подставляются уже не в QTableView , а в различные произвольные объекты. Например QLineEdit или QComboBox. Или в диалоговое окно, для добавления записей, с которым поработаем в этой статье.

Итак, задача стоит следующая. Написать программу, которая выводит в таблицу список компьютеров, а каждый компьютер имеет три поля данных: Имя Хоста, IP-адрес и MAC-адрес. Также должна быть кнопка для вызова диалогового окна, через которое Мы можем добавить новое устройство в таблицу. Также у нас должна быть возможность редактирования записей через тоже самое диалоговое окно.

После того, как задача описана, приступаем к её реализации в программном коде, который был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для QDataWidgetMapper

Проект создается как Приложение Qt Widgets, в котором создаются следующие файлы:

  • QDataMapperWidget.pro - профайл;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp - исходный код окна;
  • main.cpp - основной исходный файл, с которого стартует приложение;
  • mainwindow.ui - формочка основного окна приложения;
  • database.h - заголовочный файл вспомогательного класса, применяющегося для работы с информацией, которая помещена в базу данных;
  • database.cpp - исходный файл вспомогательного класса, применяющегося для работы с информацией, которая помещена в базу данных;
  • dialogadddevice.h - заголовочный файл диалогового окна для добавления и редактирования записей;
  • dialogadddevice.cpp - исходный файл диалогового окна для добавления и редактирования записей;
  • dialogadddevice.ui

Примечание. Большую часть интерфейса создаю в дизайнере, чтобы не загромождать логику основного кода лишней информацией. По сути это лишь дело вкуса и привычки.

Qt/C++ - Урок 007. Фильтр для записей в QSqlTableModel

TutorialQtQSqlRelationalTableModel, QSqlTableModel, QSqlTableModel example, фильтр231

Продолжая работу с таблицами в Qt , хотелось бы освятить тот момент, как установить фильтр на модель представления данных в QSqlTableModel или в QSqlRelationalTableModel . Поэтому для описания процесса установки фильтра за основу был взят программный код из урока по QSqlTableModel .

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта

В данном уроке структура проекта остается аналогичной проекту из урока по QSqlTableModel.

mainwindow.ui

Внесём дополнительные объекта в главное окно приложения, а именно добавим следующие элементы:

  • dateEditFROM - начальная дата;
  • dateEditTO - конечная дата;
  • timeEditFROM - начальное время;
  • timeEditTO - конечное время;
  • pushButton - кнопка, по нажатию которой будет применяться фильтр.

Qt/C++ - Урок 006. QSqlQueryModel - Таблицы в Qt с помощью SQL-запросов

TutorialQtQSqlQueryModel, qsqlquerymodel example, qt, qt таблицы, query417

Использование QSqlQueryModel для формирования таблиц в Qt является наиболее хардкорным вариантом с наиболее низким уровнем абстракции, чем использование QSqlTableModel или QSqlRelationalTableModel . Но при всём при этом и наиболее гибкий вариант, который требует более глубокого знания языка SQL-запросов. В предыдущей статье были построены две таблицы:

  • Основная , в которой были колонки Дата, Время, Имя Хоста, IP-адрес.
  • Таблица устройств, в которой были колонки Имя Хоста и IP-адрес.

В Основной таблице в колонках Имени Хоста и IP-адреса указывались ID-устройств, по которым проводилась подстановка данных из Таблицы устройств. В данной статье структура первой таблицы и следовательно таблицы будут выглядеть иначе:

  • Основная , в которой были колонки Дата, Время, ID устройства.
  • Таблица устройств, в которой были колонки Имя Хоста и IP-адрес.

Генерация Основной таблицы в Приложении будет производиться SQL-запросом и таблица будет иметь соответственно колонки Дата, Время, Имя Хоста и IP-адрес.

Реклама

QML - Урок 015. Разработка QML Data Mapper - Аналог QDataWidgetMapper

TutorialQMLQML, Qt, QDataWidgetMapper, mapper, QMLDataMapper92

В процессе переноса GUI одной софтины с QWidgets на QML обнаружилось отсутствие аналога QDataWidgetMapper для QML . Данный факт был несколько портящим настроение. Но делать было нечего, кроме как искать другие способы реализации или делать полностью свой велосипед для этого, свой Qml Data Mapper.

Тем не менее поиски на просторах сети дали свои результаты в качестве примера 2011 года от разработчиков Nokia по реализации SQL Widget Mapper для BlackBerry на основе Cascades (фреймворка для native разработки на QML Qt под BlackBerry, соответственно). Путём вечерней медитации над данным примером удалось перепилить код для нынешнего QML Qt , который вполне неплохо будет чувствовать себя как при работе под Desktop, так и при работе под Android, (кроссплатформенность как ни как).

Для демонстрации работы QML Data Mapper будет написано приложение, которое работает с базой данных SQLite. При каждом запуске приложение записывает несколько строк в базу данных, из которой данные забираются при помощи модели данных наследованной от QSqlQueryModel и отображаются в QML TableView. В главном окне приложения присутствует кнопка, по нажатию которой вызывается диалоговое окно, в котором отображается информация о первой строке таблицы. При двойном клике по одной из строк таблицы также вызывается диалоговое окно, но с информацией об этой строке. Также в диалоговом окне присутствуют кнопки для пролистывания информации из таблицы.

Qt/C++ - Урок 029. Изображение в базе данных в Qt – Сохранение и Восстановление

TutorialQtBLOB, QPixmap, Qt, SQL, SQLite, база данных, изображение251

Изображение в базе данных может быть сохранено в формате BLOB (англ. Binary Large Object - двоичный большой объект), то есть в формате массива двоичных данных. Формат BLOB также подходит для сохранения аудио и видео данных в базах данных.

Рассмотрим сохранение и восстановление изображения из базы данных на примере следующего приложения, в котором скриншот с экрана компьютера будет сохраняться в базе данных и выводиться в специальный QLabel , когда соответствующая запись будет выбрана в QTableView , который будет отображать все записи об изображения, хранящихся в базе данных.

Таким образом имеем таблицу в базе данных со следующими полями:

  • id (INTEGER) - id записи;
  • Name (VARCHAR(255)) - название хранящегося в базе данных файла;
  • Pic (BLOB) - поле для хранения изображений в базе данных.

Если не вдаваться подробно в урок, то самая ценная информация по данной теме в конце файла mainwindow.cpp в следующих методах:

  • MainWindow::on_screenButton_clicked()
  • MainWindow::slotCurrentPic(QModelIndex index)

Структура проекта

  • PicDataBase .pro - профайл проекта;
  • database.h - заголовочный файл бессменного класса обёртки для работы с базой данных;
  • database.cpp - файл исходных кодов класса-обёртки для работы с базой данных;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp -файл исходных кодов основного окна приложения;
  • mainwindow.ui - форма главного окна приложения;
  • main.cpp - основной файл исходных кодов приложения.

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

TutorialQtdatabase, QSqlTableModel, QSqlTableModel example, qt, qt таблицы, sql, sqlite633

Для того, чтобы представить информацию, содержащуюся в таблице базы данных, во фреймворке Qt используется несколько классов:

  • QSqlQueryModel - модель, которая формирует таблицу путем задания сырого SQL-запроса. Может быть полезна при формировании особо изощренных фильтров и компиляции информации из различных таблиц базы данных. О ней подробнее в следующих уроках.
  • QSqlTableModel - предмет нашей беседы в данной статье. Модель, которая формирует таблицу по имени той таблицы, которая существует в базе данных. Из минусов можно отметить отсутствие методов подключения связей c другими таблицами, чтобы подставлять значения в поля из других таблиц по ID.
  • QSqlRelationalTableModel - класс, который позволяет формировать таблицу со связями из других таблиц, подменяя значения таблицы, которую представляет данная модель, по ID записей, содержащихся в других таблицах.

Для комфортной работы с информацией, которая помещена в базу данных применяется дополнительный класс, который частично представляет собой шаблон проектирования "Фасад" .

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для QSqlTableModel

Проект создается как Приложение Qt Widgets, в котором создаются следующие файлы:

  • DataBase.pro - профайл;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp - исходный код окна;
  • main.cpp - основной исходный файл, с которого стартует приложение;
  • mainwindow.ui - формочка основного окна приложения;
  • database.h - заголовочный файл вспомогательного класса, применяющегося для работы с информацией, которая помещена в базу данных;
  • database.cpp - исходный файл вспомогательного класса, применяющегося для работы с информацией, которая помещена в базу данных;

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

TutorialQtQSqlTableModel, Qt, paint127

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

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

Для этого необходимо наследоваться от класса QSqlTableModel и переопределить метод QSqlTableModel::data(). После чего использовать в качестве модели данных новый класс наследник.

Qt/C++ - Урок 040. Типы данных различных Баз Данных в Qt

TutorialQtDECIMAL, INTEGER, MS SQL, Qt, SQL, типы данных127

В процессе разработки приложения под Qt , которое должно будет работать с базами данных необходимо учитывать тот нюанс, что драйвер Qt для целевой Базы Данных может не поддерживать все типы данных, которые Вы могли заложить в Вашу Базу Данных. Например, один из подобных примеров, с которым столкнулся один из Читателей сайта, это проблема с отображением типа данных DECIMAL через QSqlTableModel . В то время, как при разработке приложения на C++ Builder этот тип данных отлично отображался в представлении.

А работа производилась с базой данных MS SQL , для которой использовался драйвер ODBC . Результаты работы приложений на C++ Builder и на Qt приведены на нижеследующих рисунках. Разница во внешнем виде таблиц состоит в том, что в приложении на Qt отсутствуют значения в представлении, где тип данных в базе данных был объявлен как DECIMAL .

Реклама

Реклама