|
Автор |
Сообщение |
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Базы данных в Qt4
Автор: Щербаков Антон Юрьевич
Мыло: krow at original-auto.ru
При написании программ, часто приходтся прибегать к использовании баз данных (БД). В данной статье речь пойдёт об использовании баз данных при программировании с использованием классов Qt4.
Перед рассмотрением работы с БД следует немного освежить в памяти принципы построения классов Qt4.
Базовым в Qt4 является класс QObject, все остальные классы (как графические так и не графические) наследуются из базового класса. В нём заложены такие важные механизмы как сигналы, слоты, свойства объектов и пр.
Основным используемыми классами для постороения GUI (Graphic User Interface) приложений являются классы QWidget и QMainWindow. Первый используется как правило при построении однооконных приложений (в примере рассматриваемом в данной статье будем использован именно он), второй используется при построении MDI приложений.
Для использования базы определенной базы данных необходимо для начала произвести подключение к движку БД, установить изначальные параметры доступа к БД, а потом можно производить манипуляции с имеющейся БД и содержащимися внеё таблицами:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "book");
втрой араметр не обязателен, если его не указывать, то будет назначено подключение по умолчанию. Это удобно если в программе используется одна БД, иначе нужно указывать явно название подключения.
Кроме данной сртроки часто приходится указывать следующие свойства БД: имя пользователя(name), пароль (password), адрес подключения к БД (hostname).
Создав экземпляр подключения db необходимо установить соединение методом QSqlDatabase::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);
если возникла ошибка открытия БД, выпадет соответствующее сообщение.
Для задания запросов в Qt4 служит класс QSqlQuery:
QSqlQuery *query = new QSqlQuery(QSqlDatabase::database("book"));
query->exec("select * from book");
при создании экземпляра класса принимается необязательный параметр QSqlDatabase &db. Функция QSqlDatabase::database() возвращает наименование поключения. Если параметр не указан то будет использовано подключение по умолчанию, т.е если при создании экземпляра БД было указано имя подключения, то и при создании экземпляра класса QSqlQuery параметр указывается. Методом QSqlQuery::exec() осуществляется выполнение запроса. Также также весьма полезными являются методы навигации: QSqlQuery::first(), QSqlQuery::last(), QSqlQuery::next(), QSqlQuery::prev().
Для доступа к данным полученым в результате запроса является метод QSqlQuery:value(int). В качестве параметра этот метод принимает порядковый номер поля в таблице:
int id = query->value(0).toInt() + 1;
Механизмы модель-представление предназначены для упращения работы с БД в Qt4. Для этого служит класс QSqlTableModel:
QSqlTableModel *model = new QSqlTableModel(QSqlDatabase::database("book");
model->setTable("table");
model->select();
После создания экземпляра класса модели, ей нужно утсновить свойство "table" методом setTable(), принимающий в качестве парметра имя таблицы. После подготовительных действий вызывается метод select() производящий соединение модели и таблицы.
Для пользователя важен не программный код, так что следует позаботиться об удобном отображении табличной информации. В Qt4 для этого служат визуальные классы: QTableWidget и QTableView. Мы будем использовать первый, для более наглядного представления как работают механизмы работы с БД в Qt4. Второй класс предназначен для механизма модель-представление:
QTableView *view = new QTableView;
view->setModel(model);
методом setModel() мы устанавливаем связь между графической таблицей и программным кодом.
Возвращаемся к QTableWidget. Перед отображением информации полученной в качестве SQL запроса, следует произвести некоторые подготовительные действия:
1)Указываем количество столбцов в таблице (ui.tableWidget->setColumnCount(2)
2)Устанавливаем читаемые заголовки столбцов:
ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromUtf8("ФИО")));
ui.tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(QString::fromUtf8("Телефон")));
3)Устанавливаем количество строк в таблице (ui.tableWidget->setRowCount(2)
4)Заполняем таблицу:
ui.tableWidget->setVerticalHeaderItem(0, new QTableWidgetItem(query->value(0).toString()));
ui.tableWidget->setItem(0, 0, new QTableWidgetItem(query->value(1).toString()));
ui.tableWidget->setItem(0, 1, new QTableWidgetItem(query->value(2).toString()));
Данные в таблице заполняются в цикле (условие предоставляется на ваш выбор).
Подходим к формированию внешнего вида программы. Он может создаваться как вручную, описывая нужные визуальные классы, так и с помощью встроенной программы designer.
Для того чтобы программа приняла внешний вид разработанный на форме:
1) В хеадере описываемого класса в раздере private объявляем переменную: Ui::fPhoneBook ui. И в этом же файле в разделе модулей добавляем #include "ui_fPhoneBook.h".
Следует обратить внимание что этот файл появляется в процессе компилирования программы, его создавать вручную не нужно. Он содержит текстовое описание формы. После компиляции имя его задаётся как приставка "ui_" и имя файла формы, но только с расширением .h.
2) В описании конструктора класса вставляется строчка ui.setupUi(this); Форму сохраняем в том же каталоге где и программа.
Переходим к главному файлу main.cpp:
#include
#include
#include "phoneBook.h"
int main (int argc, char * argv[])
{
QApplication app(argc, argv);
phoneBook *window = new phoneBook();
window->show();
return app.exec();
}
Внешний вид полученной программы:
Для корректной компиляции программы в .pro файлу добавляется строка:
QT += sql
Как видно ничего сложного в создании приложений с оспользованием БД нет. Конечно программа довольно проста, но для дополнения её другими функциями не нужно прикладывать существенных услий, все основные функции уже описаны. СУБД для примера выбрана Sqlite.
Исходники программы: http://dkws.org.ua/konkurs/krow/phonebook.rar |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
jeder
Почетный флеймер
Зарегистрирован: 08.06.2007 Сообщения: 1387
|
|
|
|
Цитата: |
Базы данных в Qt4
|
Я конечно понял, о чём речь, но я не программист
Куда все команды надо писать? В SQL или QT4-это и есть БД сама в себе? |
|
Вернуться к началу |
|
|
Krow
Злостный хелпер
Зарегистрирован: 09.06.2006 Сообщения: 324 Откуда: Краснодар->Ейск
|
|
|
|
SQL запросы вставляются в метод QSqlQuery::exec()
а сама программа собирается с помощью инструментария Qt. по сути этот инструментарий набором классов и командной строкой. а для длоступа к базам данных используются втроенные драйвера. их 9, но можно делать и свои.. Его можно интегрировать в ту же MS Visual Studio.. в лине я лично использую KDevelop. хотя собрать можно везде с помощью команд :qmake -project, qmake, make. если что то пойдет не так, то в консоль вывалится соответствующие сообщения об ошибках.
если кого заинтересует данная тематика пишите, буду рад ответить. _________________ если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы! |
|
Вернуться к началу |
|
|
jeder
Почетный флеймер
Зарегистрирован: 08.06.2007 Сообщения: 1387
|
|
|
|
Цитата: |
SQL запросы вставляются в метод QSqlQuery::exec()....
|
Есть повод написать ещё одну статью |
|
Вернуться к началу |
|
|
Krow
Злостный хелпер
Зарегистрирован: 09.06.2006 Сообщения: 324 Откуда: Краснодар->Ейск
|
|
|
|
О чём? не понял....
Код: |
QSqlQuery *query = new QSqlQuery(QSqlDatabase::database("book"));
query->exec("select * from book"); |
реализация была показана в статье.... если не понятно что-то то подробнее вопрос.. _________________ если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы! |
|
Вернуться к началу |
|
|
jeder
Почетный флеймер
Зарегистрирован: 08.06.2007 Сообщения: 1387
|
|
|
|
Цитата: |
если не понятно что-то то подробнее вопрос..
|
Я пока воздержусь.
В программисты пока податься не хочу, но есть у меня одна задумка, так что буду иметь ввиду, что тут можно найти спеца по таким вещам |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
jeder, Krow как раз тот, кто тебе нужен! |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Krow
Злостный хелпер
Зарегистрирован: 09.06.2006 Сообщения: 324 Откуда: Краснодар->Ейск
|
|
|
|
конечно обращайся. завтра будет ещё одна статья. _________________ если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы! |
|
Вернуться к началу |
|
|
ShprotX
Участник тусовки
Зарегистрирован: 07.01.2007 Сообщения: 312 Откуда: Украина
|
|
|
|
1. Где полный исходный код?
2. Как связано
Код: |
QTableView *view = new QTableView;
view->setModel(model);
методом setModel() мы устанавливаем связь между графической таблицей и программным кодом. |
и
Код: |
4)Заполняем таблицу:
ui.tableWidget->setVerticalHeaderItem(0, new QTableWidgetItem(query->value(0).toString()));
ui.tableWidget->setItem(0, 0, new QTableWidgetItem(query->value(1).toString()));
ui.tableWidget->setItem(0, 1, new QTableWidgetItem(query->value(2).toString())); |
? |
|
Вернуться к началу |
shprotx@jabber.ru |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Цитата: |
1. Где полный исходный код?
|
|
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Krow
Злостный хелпер
Зарегистрирован: 09.06.2006 Сообщения: 324 Откуда: Краснодар->Ейск
|
|
|
|
ShprotX писал(а): |
1. Где полный исходный код?
2. Как связано
Код: |
QTableView *view = new QTableView;
view->setModel(model);
методом setModel() мы устанавливаем связь между графической таблицей и программным кодом. |
и
Код: |
4)Заполняем таблицу:
ui.tableWidget->setVerticalHeaderItem(0, new QTableWidgetItem(query->value(0).toString()));
ui.tableWidget->setItem(0, 0, new QTableWidgetItem(query->value(1).toString()));
ui.tableWidget->setItem(0, 1, new QTableWidgetItem(query->value(2).toString())); |
? |
1) полный исходный код преставлен чуть ниже статьи.
2) эти 2 куска кода никак не связаны.
первый показывает как всё можно сделать легко используя класс QSqlTableModel и класс QTableView. Многие рутинные функции в этих классах уже реализованы (такие как добавление, редактирование, удаление записей).
а второй кусок показывает как это всё можно делать руками (я привык именно так. т.к. в основном использую СУБД sqlite для малых проектов. эта субд имеет некоторые ограничения в плане выборки записей. поэтому ручной метод здесь предпочтительней,) если вы используете что то типа mysql, firebird или postgre sql то использование первого метода работы с БД более оправдано.
среди Qt разработчиков есть как бы два лагеря: одни доверяют своему коду обработки записей БД, а другие доверяют уже написанным классам. у каждого мнения есть свои плюсы и минусы. _________________ если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы! |
|
Вернуться к началу |
|
|
ShprotX
Участник тусовки
Зарегистрирован: 07.01.2007 Сообщения: 312 Откуда: Украина
|
|
|
|
Кто-нибудь пробовал их смотреть? Там нет ключевых файлов. |
|
Вернуться к началу |
shprotx@jabber.ru |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Krow, непорядок насчет исходников! |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Krow
Злостный хелпер
Зарегистрирован: 09.06.2006 Сообщения: 324 Откуда: Краснодар->Ейск
|
|
|
|
Шпрос, сори. по спешке забыл туда phoneBook.cpp сунуть.
Den залил новый архив. _________________ если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы! |
|
Вернуться к началу |
|
|
ShprotX
Участник тусовки
Зарегистрирован: 07.01.2007 Сообщения: 312 Откуда: Украина
|
|
|
|
Krow писал(а): |
Шпрос, сори. по спешке забыл туда phoneBook.cpp сунуть.
Den залил новый архив. |
Уже лучше, ждем пока прибудут остальные файлы.
PS: QString::fromUtf8("Îøèáêà") - жгешь |
|
Вернуться к началу |
shprotx@jabber.ru |
|
|
|
|