Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Базы данных в Qt4
На страницу 1, 2  След.
 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Конкурс
 
Автор Сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пт Фев 15, 2008 4:22 pm    Заголовок сообщения: Базы данных в Qt4
Ответить с цитатой

Базы данных в 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)Wink
2)Устанавливаем читаемые заголовки столбцов:

ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromUtf8("ФИО")));
ui.tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(QString::fromUtf8("Телефон")));

3)Устанавливаем количество строк в таблице (ui.tableWidget->setRowCount(2)Wink
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

СообщениеДобавлено: Сб Фев 16, 2008 2:08 am    Заголовок сообщения:
Ответить с цитатой

Цитата:

Базы данных в Qt4

Я конечно понял, о чём речь, но я не программист Embarassed
Куда все команды надо писать? В SQL или QT4-это и есть БД сама в себе? Confused
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Сб Фев 16, 2008 6:09 am    Заголовок сообщения:
Ответить с цитатой

SQL запросы вставляются в метод QSqlQuery::exec()
а сама программа собирается с помощью инструментария Qt. по сути этот инструментарий набором классов и командной строкой. а для длоступа к базам данных используются втроенные драйвера. их 9, но можно делать и свои.. Его можно интегрировать в ту же MS Visual Studio.. в лине я лично использую KDevelop. хотя собрать можно везде с помощью команд :qmake -project, qmake, make. если что то пойдет не так, то в консоль вывалится соответствующие сообщения об ошибках.
если кого заинтересует данная тематика пишите, буду рад ответить.
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
jeder

Почетный флеймер


Зарегистрирован: 08.06.2007
Сообщения: 1387

СообщениеДобавлено: Сб Фев 16, 2008 11:49 am    Заголовок сообщения:
Ответить с цитатой

Цитата:

SQL запросы вставляются в метод QSqlQuery::exec()....

Есть повод написать ещё одну статью Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Сб Фев 16, 2008 2:53 pm    Заголовок сообщения:
Ответить с цитатой

О чём? не понял....

Код:
QSqlQuery *query = new QSqlQuery(QSqlDatabase::database("book"));
query->exec("select * from book");


реализация была показана в статье.... если не понятно что-то то подробнее вопрос..
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
jeder

Почетный флеймер


Зарегистрирован: 08.06.2007
Сообщения: 1387

СообщениеДобавлено: Пн Фев 18, 2008 12:18 pm    Заголовок сообщения:
Ответить с цитатой

Цитата:

если не понятно что-то то подробнее вопрос..

Я пока воздержусь.
В программисты пока податься не хочу, но есть у меня одна задумка, так что буду иметь ввиду, что тут можно найти спеца по таким вещам Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пн Фев 18, 2008 12:32 pm    Заголовок сообщения:
Ответить с цитатой

jeder, Krow как раз тот, кто тебе нужен!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Пн Фев 18, 2008 2:33 pm    Заголовок сообщения:
Ответить с цитатой

Laughing Cool
конечно обращайся. завтра будет ещё одна статья.
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
ShprotX

Участник тусовки


Зарегистрирован: 07.01.2007
Сообщения: 312
Откуда: Украина

СообщениеДобавлено: Вт Фев 19, 2008 5:36 am    Заголовок сообщения:
Ответить с цитатой

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
Откуда: Кировоград, Украина

СообщениеДобавлено: Вт Фев 19, 2008 6:11 am    Заголовок сообщения:
Ответить с цитатой

Цитата:

Исходники программы: http://dkws.org.ua/konkurs/krow/phonebook.rar

Цитата:

1. Где полный исходный код?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Вт Фев 19, 2008 8:45 am    Заголовок сообщения:
Ответить с цитатой

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 разработчиков есть как бы два лагеря: одни доверяют своему коду обработки записей БД, а другие доверяют уже написанным классам. у каждого мнения есть свои плюсы и минусы.
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
ShprotX

Участник тусовки


Зарегистрирован: 07.01.2007
Сообщения: 312
Откуда: Украина

СообщениеДобавлено: Вт Фев 19, 2008 12:06 pm    Заголовок сообщения:
Ответить с цитатой

den писал(а):

Исходники программы: http://dkws.org.ua/konkurs/krow/phonebook.rar

Кто-нибудь пробовал их смотреть? Там нет ключевых файлов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение shprotx@jabber.ru
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вт Фев 19, 2008 12:21 pm    Заголовок сообщения:
Ответить с цитатой

Krow, непорядок насчет исходников!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Вт Фев 19, 2008 12:47 pm    Заголовок сообщения:
Ответить с цитатой

Шпрос, сори. по спешке забыл туда phoneBook.cpp сунуть.
Den залил новый архив.
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
ShprotX

Участник тусовки


Зарегистрирован: 07.01.2007
Сообщения: 312
Откуда: Украина

СообщениеДобавлено: Вт Фев 19, 2008 1:39 pm    Заголовок сообщения:
Ответить с цитатой

Krow писал(а):
Шпрос, сори. по спешке забыл туда phoneBook.cpp сунуть.
Den залил новый архив.

Уже лучше, ждем пока прибудут остальные файлы.

PS: QString::fromUtf8("Îøèáêà") - жгешь Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение shprotx@jabber.ru
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Конкурс Часовой пояс: GMT
На страницу 1, 2  След.
Страница 1 из 2
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис