- •Аннотация к разделу
- •Теоритические принципы создания приложений бд
- •Основные задачи и сложности организации работы с бд
- •Программный (встроенный) sql
- •Статический sql
- •Динамический sql
- •Интерфейсы программирования приложений бд (api)
- •Интерфейс odbc
- •Механизм использования бд, применяемый в современных графических средствах разработки
- •Создание приложения, использующего бд Аннотация к подразделу
- •Настройка источников данных odbCвwindows
- •Базовые сведения о Qt
- •Введение
- •Модули Qt
- •Собственная система сборки Qt
- •Сигналы и слоты
- •Небольшой пример использования сигналов и слотов
- •Литература по Qt
- •Программный уровень
- •Уровень пользовательского интерфейса
- •Операции с бд
- •Соединение с бд
- •Выполнение запросов выборки и возврат результатов
- •Выполнение запросов вставки, обновления и удаления
- •Использование параметризованных запросов
- •Выполнение транзакций
- •Связь данных с пользовательским интерфейсом
- •Использование классов – моделей данных sql.
- •Отображение результата запроса выборки в таблице
- •Отображение и редактирование данных таблиц
- •Отображение и редактирование данных таблиц с использованием подстановки для внешних ключей
- •Связь элементов данных с обычными виджетами
- •Настройка собственной модели данных
Небольшой пример использования сигналов и слотов
Описание класса, наследуемого от QObjectможет выглядеть вот так:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue)
private:
int m_value;
};
Класс, наследованный от QObject, имеет то же самое внутреннее состояние, что и обычный класс, и обеспечивает открытые методы для доступа к этому состоянию, но дополнительно у него есть поддержка для использования сигналов и слотов. Этот класс может сообщить внешнему миру что его состояние изменилось выработав сигнал valueChanged() и у него есть слот, в который другие объекты могут посылать сигналы.
Слоты реализуются программистом. Возможная реализация слота Counter::setValue() выглядит следующим образом:
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
Ключевое слово emit вырабатывает сигнал valueChanged() объекта с новым значением в качестве аргумента.
В следующем примере мы создаем два объекта типа Counter и соединяем сигнал valueChanged() первого со слотом setValue() второго используя статическую функцию QObject::connect():
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12
b.setValue(48); // a.value() == 12, b.value() == 48
Литература по Qt
Макс Шлее "Qt4 Профессиональное программирование на C++";
http://doc.qt.io/
Модуль QtSQL
Подключение QtSQL к проекту
Как уже упомянулось выше, в Qt есть отдельный модуль, предоставляющий удобный «сервис» использования БД – QtSql.
Для его использования добавить следующую строку в .pro файл:
Qt += sql
Чтобы использовать модуль Qt Sql, а для работы с ее классами, нужно включать одноименный заголовок.
#include <Qt Sql>
Уровни Qt Sql
КлассыQtSqlразделены на три уровня:
Уровень драйверов;
Программный уровень;
Уровень пользовательского интерфейса.
Уровень драйверов
Уровень драйверов актуально использовать при создании собственного драйвера БД. Этот слой обеспечивает низкоуровневый мост между конкретными базами данных и программным уровнем. К уровню драйверов относятся классы для получения данных на физическом уровне:
QSqlDriver
QSqlDriverCreator<T*>
QSqlDriverCreatorBase,
QSqlDriverPlugin
QSqlResult
QSqlDriver является абстрактным базовым классом, предназначенным для доступа к специфичным БД. Важно, что класс не должен быть использован «прямо», взамен нужно воспользоваться QSqlDatabase (программный уровень). Хотя, если вы хотите создать свой собственный драйвер Qt SQL, то можете наследовать от QSqlDriver и реализовать чисто виртуальные, и нужные вам виртуальные функции.
QSqlResultпредоставляет абстрактный интерфейс для доступа к данным специфичных БД.
QSqlCreatorBase – базовый класс для фабрик SQL драйверов. Чтобы возвращать экземпляр специфичного поскласса класса QSqlDriver, который вы хотите предоставить, нужно переопределить метод QSqlCreatorBase::createObject() в потомках класса.
QSqlDatabase несет ответственность за загрузку и управление плагинов драйверов баз данных. Когда БД добавлена (это делается функцией QSqlDatabase::addDatabase()), необходимый плагин драйвера загружается (используя QSqlDriverPlugin).
QSqlDriverPlugin предоставляет собой абстрактный базовый класс для пользовательских QSqlDriver плагинов.