Программирование на C++ с использованием библиотеки Qt4




Листинг. Модель и представление таблицы БД (файл examples-qt/db02/db02.cpp) - часть 2


  • (8-10) В конструкторе модели таблицы вызвали конструктор базового класса и определённый ниже метод refresh (131), в котором указаны заголовки столбцов и текст SQL-запроса, выполняемый для получения данных из БД.
  • (13-22) В методе flags переопределили свойства ячеек таблицы.
  • (16) Получили значения флагов-свойств, которые определены для данного столбца в базовом классе.
  • (17-18) Для всех столбцов, кроме первого (вернее, нулевого) и последнего, выставили флаг разрешения редактирования Qt::ItemIsEditable.
  • (19-20) Для последнего столбца установили признак Qt::ItemIsUserCheckable, в результате во всех его ячейках перед текстовой меткой будет отображаться элемент QCheckBox.
  • (24-92) В методе data переопределяются данные, "хранящиеся" в ячейках таблицы. В зависимости от параметра role (роль), это либо сами данные, читаемые из БД, либо параметры их отображения.
  • (28) Получили значение, определённое в базовом классе.
  • (30-90) Определяем параметры ячейки таблицы, в зависимости от значения параметра role: Qt::DisplayRole (данные для отображения ячейки таблицы), Qt::EditRole (данные для режима редактирования), Qt::TextColorRole (цвет текста), Qt::TextAlignmentRole (выравнивание текста), Qt::FontRole (параметры шрифта), Qt::BackgroundColorRole (цвет фона ячейки), Qt::CheckStateRole (надо ли отображать элемент QCheckBox), Qt::SizeHintRole (предпочитаемые размеры ячейки).
  • (34-35) Для самого первого столбца перед числом добавили символ "№".
  • (36-37) Для столбца с датами рождения в режиме отображения задали формат "число.месяц.год" (по умолчанию действует формат "год-месяц-число").
  • (38-40) Для столбца зарплат в режиме отображения установили точность два знака после запятой.
  • (41-42) В последнем столбце отображаем текст "Да" или "Нет".
  • (43-44) Для всех остальных стрлбцов (остался только столбец с именами работников) ничего не изменяем.
  • (46-50) Для столбца с именами установили голубой цвет символов, для всех остальных -- цвет по умолчанию.
  • (52-58) Числа выравниваем по правому краю, даты и надписи "Да/Нет" -- по центру, остальные ячейки -- по левому краю. Во всех случаях центрируем по вертикали.
  • (60-65) Для столбца имён задали жирный шрифт "Helvetica" размером 10 пунктов, для всех остальных ячеек -- шрифт по умолчанию.
  • (67-74) Установили цвет фона для ячеек самого первого и последнего столбцов (для чётных строк -- немного светлее, чем для нечётных). Для всех остальных столбцов -- цвет фона по умолчанию.
  • (76-81) Для ячеек последнего столбца устанавливаем галочку или сбрасываем её, в зависимости от значения, хранящегося в БД.
  • (83-90) Установили предпочтительные размеры ячеек.
  • (94-129) В методе setData переопределяются данные, которые будут записываться в БД.
  • (98-99) Могут изменяться только ячейки из столбцов с 1 по 4.
  • (101-103) Выяснили значение поля id (целочисленный идентификатор) изменяемой записи.
  • (107-128) Определили текст SQL-запроса для обновления данных каждого столбца таблицы.
  • (131-144) Задали текст SQL-запроса для чтения данных из БД и отображаемые заголовки столбцов таблицы.
  • (147-150) В конструкторе представления таблицы не забыли вызвать конструктор базового класса.
  • (152-156) Определяем действия, выполняемые при изменении размеров таблицы (в данном случае делается автоматическая подгонка размеров по содержимому ячеек).
  • (159-189) Процедура main повторяет текст предыдущей программы, только в (178-181) используется наш класс модели и класс для представления таблицы.
  • Для своей модели мы использовали базовый класс QSqlQueryModel, работающий с произвольным набором SQL-запросов для чтения и записи данных в БД. Но за всё приходится платить: нам пришлось подробно расписывать реализацию методов data и setData. В данном случае мы имели дело с единственной таблицей базы данных, поэтому можно было в качестве базового класса взять QSqlTableModel.

    Проверьте, как работает эта программа. Намного лучше, чем предыдущая, не правда ли? Размеры ячеек теперь не "прыгают" при редактировании, а при щелчке левой кнопкой мыши по элементу QCheckBox в ячейках последнего столбца автоматически изменяется текстовая метка "Да/Нет". Но ввести трёхзначную зарплату всё ещё не получается. Мы исправим данный недостаток в следующем разделе.




    Содержание  Назад