Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование БД.docx
Скачиваний:
74
Добавлен:
08.03.2016
Размер:
712.24 Кб
Скачать
      1. Небольшой пример использования сигналов и слотов

Описание класса, наследуемого от QObjectможет выглядеть вот так:

  1. #include <QObject>

  2. class Counter : public QObject

  3. {

  4. Q_OBJECT

  5. public:

  6. Counter() { m_value = 0; }

  7. int value() const { return m_value; }

  8. public slots:

  9. void setValue(int value);

  10. signals:

  11. void valueChanged(int newValue)

  12. private:

  13. int m_value;

  14. };

Класс, наследованный от QObject, имеет то же самое внутреннее состояние, что и обычный класс, и обеспечивает открытые методы для доступа к этому состоянию, но дополнительно у него есть поддержка для использования сигналов и слотов. Этот класс может сообщить внешнему миру что его состояние изменилось выработав сигнал valueChanged() и у него есть слот, в который другие объекты могут посылать сигналы.

Слоты реализуются программистом.  Возможная реализация слота Counter::setValue() выглядит следующим образом:

  1. void Counter::setValue(int value)

  2. {

  3.    if (value != m_value) {

  4.      m_value = value;

  5.      emit valueChanged(value);

  6.    }

  7. }

Ключевое слово emit вырабатывает сигнал valueChanged() объекта с новым значением в качестве аргумента.

В следующем примере мы создаем два объекта типа Counter и соединяем сигнал valueChanged() первого со слотом setValue() второго используя статическую функцию QObject::connect():

  1. Counter a, b;

  2. QObject::connect(&a, SIGNAL(valueChanged(int)),

  3.             &b, SLOT(setValue(int)));

  4. a.setValue(12);   // a.value() == 12, b.value() == 12

  5. b.setValue(48);   // a.value() == 12, b.value() == 48

      1. Литература по Qt

Макс Шлее "Qt4 Профессиональное программирование на C++";

http://doc.qt.io/

    1. Модуль QtSQL

      1. Подключение QtSQL к проекту

Как уже упомянулось выше, в Qt есть отдельный модуль, предоставляющий удобный «сервис» использования БД – QtSql.

Для его использования добавить следующую строку в .pro файл:

Qt += sql

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

#include <Qt Sql>

      1. Уровни Qt Sql

КлассыQtSqlразделены на три уровня:

  1. Уровень драйверов;

  2. Программный уровень;

  3. Уровень пользовательского интерфейса.

        1. Уровень драйверов

Уровень драйверов актуально использовать при создании собственного драйвера БД. Этот слой обеспечивает низкоуровневый мост между конкретными базами данных и программным уровнем. К уровню драйверов относятся классы для получения данных на физическом уровне:

  • QSqlDriver

  • QSqlDriverCreator<T*>

  • QSqlDriverCreatorBase,

  • QSqlDriverPlugin

  • QSqlResult

QSqlDriver является абстрактным базовым классом, предназначенным для доступа к специфичным БД. Важно, что класс не должен быть использован «прямо», взамен нужно воспользоваться QSqlDatabase (программный уровень). Хотя, если вы хотите создать свой собственный драйвер Qt SQL, то можете наследовать от QSqlDriver и реализовать чисто виртуальные, и нужные вам виртуальные функции.

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

QSqlCreatorBase – базовый класс для фабрик SQL драйверов. Чтобы возвращать экземпляр специфичного поскласса класса QSqlDriver, который вы хотите предоставить, нужно переопределить метод QSqlCreatorBase::createObject() в потомках класса.

QSqlDatabase несет ответственность за загрузку и управление плагинов драйверов баз данных. Когда БД добавлена (это делается функцией QSqlDatabase::addDatabase()), необходимый плагин драйвера загружается (используя QSqlDriverPlugin).

QSqlDriverPlugin предоставляет собой абстрактный базовый класс для пользовательских QSqlDriver плагинов.