Добавим в класс главного окна переменные и функцию (файл mainwindow.h, секция private):
// база данных
QSqlDatabase db;
// модель данных
QSqlTableModel *model;
// функция для подключения к базе данных
bool createConnection();
Создадим функцию в файле mainwindow.cpp для реализации подключения к БД.
bool MainWindow::createConnection()
{
return true;
}
Подключим ее в конструкторе (после ui->setupUi(this);):
createConnection();
Весь дальнейший код пишите внутри функции createConnection().
Для подключения к базе данных надо указать название SQL-драйвера, например:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
Затем можно указать имя сервера, название базы данных, имя пользователя и пароль:
// db.setHostName("localhost"); // или, например, "my1.server.ru"
// db.setDatabaseName("mydb1");
// db.setUserName("root");
// db.setPassword("mypassword");
Все эти параметры можем опустить.
Вместо этого напишем:
db.setDatabaseName(":memory:");
Это важно. Предопределённое имя ":memory:" позволяет размещать временную базу данных в оперативной памяти.
После того, как все параметры подключения заданы, можно открыть соединение (метод open()). Если подключение установить не удалось, то не плохо бы узнать описание ошибки и сообщить его пользователю:
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return false;
}
2. Первичное заполнение БД.
Для исполнения команд SQL после установления соединения можно использовать класс QSqlQuery. Запросы (команды) оформляются в виде обычной строки, которая передается в метод QSqiQuery::exec().
Если подключение установлено, то можно выполнить любой SQL-запрос, например, создадим таблицу
if (db.tables().empty()) //проверка на наличие таблиц
{
//QMessageBox::critical(0, tr("Error"), tr("Database is empty"));
//создание таблицы:
QSqlQuery query;
query.exec("create table person (id int primary key, "
"firstname varchar(20), lastname varchar(20))");
//заполнение таблицы:
query.exec("insert into person values(1, 'Alina', 'Bichenko')");
query.exec("insert into person values(2, 'Kate', 'Mikova')");
query.exec("insert into person values(3, 'Olga', 'Skalskaya')");
query.exec("insert into person values(4, 'Alexander', 'Panchenko')");
query.exec("insert into person values(5, 'Victorya', 'Silivina')");
query.exec("insert into person values(6, 'July', 'Tokmakova')");
}
Данные можно добавлять и по-другому:
query.prepare("INSERT INTO person (id, firstname, lastname, ball) "
"VALUES (?, ?, ?, ?)");
query.addBindValue(7);
query.addBindValue("Bart");
query.addBindValue("Simpson");
query.addBindValue(1);
query.exec();
4. Вывод содержимого таблицы на экран.
Перейдите в режим визуального редактирования (дважды щелкнув по mainwindow.ui).
Перетащите элемент Table View на форму (рис. 8.4).
Используя (в режиме дизайна) компоновку , добейтесь фиксированного расположения элементов на экране.
Перейдите к свойствам элемента tableView и найдите horizontalHeaderStretchLastSection и поставьте “птичку” – это позволит автоматически растянуть колонки по всей длине tableView.
Изменените отображения названий всех столбцов, например:
Если при выполнении запроса возникла ошибка, то метод lastError() позволяет вывести на экран её описание:
if (!query.isActive()) QMessageBox::warning(this, tr("Database Error"), query.lastError().text());
7. Самостоятельная работа.
7.0. Сделайте так, чтобы в БД заносились данные о студентах, что выполняют эту работу, т. е. о вас.
7.1. Сделайте так, чтобы таблица сохранялась на компьютере, а не хранилась в оперативной памяти.
7.2. Измените отображаемые названия для столбцов таблицы на: №, Имя, Фамилия.
7.3. Добавьте в таблицу столбец «Средний балл». Отсортируйте таблицу по этому показателю.
7.4. Сделайте столбец с первичным ключом невидимым (с помощью метода QTableView).
7.5. Измените размеры окна, добавьте кнопку «Выход», реализуйте эту возможность.
7.6. Добавьте столбец «Дата рождения». Отсортируйте таблицу по возрасту.
7.7. Создайте оболочку для работы с БД (см. п. 8):
– должна быть возможность перехода к следующей (Next), предыдущей (Previous), первой (First) и последней (Last) записей таблицы;
– название таблицы должно отображаться в заголовке окна;
– все поля должны быть отображены на форме;
– для поля «Дата рождения» по нажатию на него должен появляться календарик;
– должна быть возможность прямо с формы добавить нового студента.
Рисунок 8.5 – Пример для работы с другой таблицой
8. Навигация по записям в таблице.
8.1. Mapper.
Для того чтобы перемещаться по записям в таблице необходимо воспользоваться классом QDataWidgetMapper, создав его описание в классе (файл mainwindow.h, секция private):
QDataWidgetMapper *mapper;
там же его необходимо подключить:
#include <QDataWidgetMapper>
и упомянуть его в конструкторе (mainwindow.cpp, функция createConnection()), связав с моделью:
mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
Перейдите в режим визуального редактирования (дважды щелкнув по mainwindow.ui).
Разбейте компоновку и уменьшите таблицу.
Перетащите элементы Line Edit и Label на форму. С помощью клавиши Ctrl выделите оба виджета и скомпонуйте их по горизонтали . С помощью окна свойств (рис. 8.6) измените имя Line Edit с lineEdit на nameEdit.
Обратите внимание – в качестве примера связь установлена лишь с одним полем «Имя», связь с другими полями – установите самостоятельно.
Запустите и протестируйте приложение.
8.2. Кнопки навигации.
Перетащите элемент PushButton на форму, задайте ему имя Next_Button, измените отображаемый текст на клавише на «Вперед», либо «Следующий», либо «>>». Нажмите на клавише правой кнопкой мыши, выберите «Перейти к слоту…» (рис. 8.7).
Рисунок 8.7 – Создание реакции на нажатие клавиши
В открывшемся диалоговом окне выберите сигнал clicked() и нажмите ОК.
В появившейся функции напишите:
mapper->toNext();
Для остальных кнопок – аналогично: toPrevious(), toFirst(), toLast().