Russian Qt Forum

Qt => Уроки и статьи => Тема начата: 8Observer8 от Март 13, 2014, 14:46



Название: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 13, 2014, 14:46
Инструментарий

- SDK Qt 5.2.0
- ОС Windows 7

Примечания
1) Инструкция составлена по видео: http://www.youtube.com/watch?v=cc06D3wuTn4 (http://www.youtube.com/watch?v=cc06D3wuTn4)
2) По следующей ссылке написано, как вставлять, редактировать и удалять ряды таблицы базы данных: http://zetcode.com/db/sqlite/datamanipulation/ (http://zetcode.com/db/sqlite/datamanipulation/)

Внешний вид приложения и описание

Приложение подключается к базе данных, где хранятся имена и пароли пользователей. Если пользователь вводит правильный пароль, то выводится сообщение:

(http://i7.pixs.ru/storage/9/6/5/151png_2788164_11228965.png)

Инструкция

- открываем браузер Mozilla Firefox
- в меню браузера выбираем "Web Developer" -> выбираем "SQLite Manager"

Примечание. Если Вы не нашли у себя "SQLite Manager", то установите: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/?src=

- в меню "SQLite Manager" выбираем "Database" -> выбираем "New Database"
- в открывшемся окне вводим имя базы данных, к примеру: Accounts

Примечание. При выборе пути для сохранения базы данных, нужно учитывать, что этот путь должен совпадать с тем путём, который вернёт статический метод QDir::currentPath()

- в меню выбираем "Table" -> "Create Table"

- заполняем форму, как показано на рисунке:

(http://i.pixs.ru/storage/7/3/8/001png_1661540_11217738.png)

- заполняем таблицу, как показано на рисунке:

(http://i.pixs.ru/storage/7/5/1/002png_4860268_11217751.png)

- запускаем Qt Creator
- если у Вас Qt Creator на русском, то я рекомендовал бы переключиться на английский. Для этого выбираем в меню "Инструменты" -> "Параметры..."
- в окне "Параметры" слева выбираем "Среда" -> открываем вкладку "Основные" -> выбираем в выпадающем списке "English" -> нажимаем кнопку "OK" -> перезапускаем Qt Creator
- в меню Qt Creator'а выбираем "File" -> "New File or Project..." (Ctrl+N)
- в разделе "Projects" выбираем "Applications" -> во второй колонке выбираем "Qt Widgets Application"
- нажимаем кнопку "Choose"
- в поле "Name" вводим: DatabaseLoginForm и нажимаем "Next" (2 раза)
- в поле "Base Class" выбираем "QDialog" -> нажимаем "Next" -> нажимаем "Finish"
- скачиваем исходный код проекта (кнопка "Download ZIP" справа-внизу): https://github.com/8Observer8/DatabaseLoginForm (https://github.com/8Observer8/DatabaseLoginForm)
- заменяем файлы текущего проекта на файлы из скаченного
- нажимаем Ctrl+R, чтобы запустить программу

P.S. На всякий случай привожу все файлы проекта здесь

DatabaseLoginForm.pro
Код
C++ (Qt)
QT += core gui sql
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = DatabaseLoginForm
TEMPLATE = app
 
 
SOURCES += main.cpp \
          dialog.cpp
 
HEADERS += dialog.h
 
FORMS += dialog.ui
 

main.cpp
Код
C++ (Qt)
#include "dialog.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   Dialog w;
   w.show();
 
   return a.exec();
}
 

dialog.h
Код
C++ (Qt)
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include <QDebug>
#include <QtSql>
#include <QFileInfo>
#include <QMessageBox>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
   Q_OBJECT
 
public:
   explicit Dialog(QWidget *parent = 0);
   ~Dialog();
 
private slots:
   void on_btnLogin_clicked();
   void on_btnClear_clicked();
 
private:
   Ui::Dialog *ui;
   QSqlDatabase myDB;
};
 
#endif // DIALOG_H
 

dialog.cpp
Код
C++ (Qt)
#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::Dialog)
{
   ui->setupUi(this);
 
   myDB = QSqlDatabase::addDatabase("QSQLITE");
 
   QString pathToDB = QDir::currentPath()+QString("/Accounts.sqlite");
   myDB.setDatabaseName(pathToDB);
 
   QFileInfo checkFile(pathToDB);
 
   if (checkFile.isFile()) {
       if (myDB.open()) {
           ui->lblResult->setText("[+] Connected to Database File");
       }
       else {
           ui->lblResult->setText("[!] Database File was not opened");
       }
   }
   else {
       ui->lblResult->setText("[!] Database File does not exist");
   }
}
 
Dialog::~Dialog()
{
   delete ui;
   qDebug() << "Closing the connection to Database file on exist";
   myDB.close();
}
 
void Dialog::on_btnClear_clicked()
{
   ui->txtUser->setText("");
   ui->txtPass->setText("");
}
 
void Dialog::on_btnLogin_clicked()
{
   QString Username, Password;
 
   Username = ui->txtUser->text();
   Password = ui->txtPass->text();
 
   if (!myDB.isOpen()) {
       qDebug() << "No connection to Database";
       return;
   }
 
   QSqlQuery qry;
 
   if (qry.exec("SELECT Username, Password, Role FROM Users WHERE Username=\'" + Username +
                "\' AND Password=\'" + Password + "\'"))
   {
       if (qry.next()) {
           ui->lblResult->setText("[+] Valid Username and Password");
           QString msg = "Username = " + qry.value(0).toString() + "\n" +
                   "Password = " + qry.value(1).toString() + "\n" +
                   "Role = " + qry.value(2).toString() + "\n";
           QMessageBox::warning(this, "Login was successful", msg);
       }
       else {
           ui->lblResult->setText("[-] Wrong Username or Password");
       }
   }
   else {
       ui->lblResult->setText("[-] Wrong query");
   }
}
 

dialog.ui
Код
C++ (Qt)
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
 <property name="geometry">
  <rect>
   <x>0</x>
   <y>0</y>
   <width>306</width>
   <height>106</height>
  </rect>
 </property>
 <property name="windowTitle">
  <string>Dialog</string>
 </property>
 <layout class="QGridLayout" name="gridLayout">
  <item row="0" column="0">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QLabel" name="label">
        <property name="text">
         <string>Username:</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLineEdit" name="txtUser"/>
      </item>
     </layout>
    </item>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <widget class="QLabel" name="label_2">
        <property name="text">
         <string>Password:</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QLineEdit" name="txtPass">
        <property name="echoMode">
         <enum>QLineEdit::Password</enum>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </item>
  <item row="0" column="1">
   <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
     <widget class="QPushButton" name="btnLogin">
      <property name="text">
       <string>Login</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="btnClear">
      <property name="text">
       <string>Crear</string>
      </property>
     </widget>
    </item>
   </layout>
  </item>
  <item row="1" column="0">
   <widget class="QLabel" name="lblResult">
    <property name="frameShape">
     <enum>QFrame::Box</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
    <property name="text">
     <string>[+] Status</string>
    </property>
   </widget>
  </item>
 </layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
 


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: gil9red от Март 13, 2014, 16:15
В примерах видел гуи-клиент, который работает с базами данных, причем работает с любыми драйверами :)

Нашел :) Лежал в демо, называется SQL Browser


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 13, 2014, 16:20
В примерах видел гуи-клиент, который работает с базами данных, причем работает с любыми драйверами :)

Отлично! Спасибо! Посмотрю в примерах Qt'а :)


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 13, 2014, 16:43
А вот еще удобная ссылочка для начинающих http://www.sqlite.org/lang.html


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 13, 2014, 16:57
А вот еще удобная ссылочка для начинающих http://www.sqlite.org/lang.html

Я тоже это находил. Но мне кажется, что для начинающих это сложновато. Я только по простым примерам могу разбираться. Вот эта ссылка мне очень помогла: http://zetcode.com/db/sqlite/datamanipulation/

Я добавил в инструкцию вот такой текст:
Цитировать
Примечания
1) Инструкция составлена по видео: http://www.youtube.com/watch?v=cc06D3wuTn4 (http://www.youtube.com/watch?v=cc06D3wuTn4)
2) По следующей ссылке написано, как вставлять, редактировать и удалять ряды таблицы базы данных: http://zetcode.com/db/sqlite/datamanipulation/ (http://zetcode.com/db/sqlite/datamanipulation/)

Я ещё написал английский вариант этой инструкции. Я плохо знаю английский, поэтому если вы найдёте какие-то грубые ошибки, то, пожалуйста, напишите в этой теме. Ссылка на инструкцию: http://qtobserver.freeoda.com/qt_sqlite.php


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 13, 2014, 17:51
Для меня вот этот клиент удобнее - http://www.sqlabs.com/sqlitemanager.php

А в Мозилле у меня такого редактора кстати нет ))

А насчет инструкции - по мне так крайне не познавательная - лучше бы сделал простой консольный проект, в котором создается бд с одной таблицей, в нее вносятся значения, читаются и удаляются. - Все было бы удобно и понятно - без лишних всяких диалогов, внешних редакторов и лирических отступлений.
Ну это конечно мое мнение))


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: xintrea от Март 14, 2014, 07:42
Для меня вот этот клиент удобнее - http://rutracker.org/forum/viewtopic.php?t=2810147

SQLiteManager. Ты за него заплатил, или с торента скачал взломанный и другим советуешь?


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 14, 2014, 07:49
Поправил ссылку 8)
Там не обязательно покупать - демо-версия ограничена количеством строк в запросах 8)


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: carrygun от Март 14, 2014, 10:14
Есть фришный SQLite Database Browser, написан на Qt, всегда им пользовался и был доволен.


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 14, 2014, 11:19
Есть фришный SQLite Database Browser, написан на Qt, всегда им пользовался и был доволен.

Спасибо большое! Пока буду пользоваться SQLite Manager из FireFox'a. А если такой возможности не будет, то скачаю SQLite Database Browser :)

Добавил в инструкцию внешний вид приложения и описание:

Внешний вид приложения и описание

Приложение подключается к базе данных, где хранятся имена и пароли пользователей. Если пользователь вводит правильный пароль, то выводится сообщение:

(http://i7.pixs.ru/storage/9/6/5/151png_2788164_11228965.png)


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 14, 2014, 13:06
Добавь версию файерфокса. Говорю же - в моем нет мэнэджера. И всякий, кто откроет эту инструкцию, тут же ее закроет, не найдя этот мэнеджер в своей мозилле..


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 14, 2014, 13:40
to OKTA

Добавил в инструкцию вот такой текст:

Примечание. Если Вы не нашли у себя "SQLite Manager", то установите: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/?src=


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 14, 2014, 13:58
much more better)


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: panAlexey от Март 14, 2014, 16:09
Было бы неплохо такую же инструкцию по FireBird


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 15, 2014, 06:15
Было бы неплохо такую же инструкцию по FireBird

Я хочу с SQLite сначала освоиться. Мне пока этой базы данных будет достаточно. Потом MySQL. А дальше посмотрим :)


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 18, 2014, 09:57
Советую сразу обратить внимание на bindValue в QSqlQuery. Когда запросы усложнятся и будут содержать спец.символы, просто так застрелишься экранировать, а через bindValue эта проблема отпадает.
Вот пример из http://habrahabr.ru/post/51650/
так
Код:
   QSqlQuery query;
   query.prepare("INSERT INTO employee (id, name, salary) "
          "VALUES (:id, :name, :salary)");
   query.bindValue(":id", 1001);
   query.bindValue(":name", "Thad Beaumont");
   query.bindValue(":salary", 65000);
   query.exec();
или так
Код:
QSqlQuery query;
   query.prepare("INSERT INTO employee (id, name, salary) "
          "VALUES (?, ?, ?)");
   query.addBindValue(1001);
   query.addBindValue("Thad Beaumont");
   query.addBindValue(65000);
   query.exec();


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: 8Observer8 от Март 18, 2014, 10:03
Ух, ты! Вот это штука классная! А то я боялся этого: QString("...%1...%n"...).arg(...)...arg(...); :)

Огромное спасибо за съэкономленное время и нервы! :)


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: OKTA от Март 18, 2014, 10:07
Это удобно не только потому, что время экономит, но и когда пишешь в БД данные, в которых может приходить неизвестно что) Придет тебе длиннющая строка, в которой будет одинарная кавычка и все - опять захочешь застрелиться, пока найдешь эту пакость  ;D


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: carrygun от Март 18, 2014, 10:41
С %1 нужно быть аккуратнее, если вы в arg() передадите что-то типа "somestring %2" и будете вызывать дальше arg'и, то может случиться нехорошее.

С именованными параметрами (:name) тоже надо аккуратнее, некоторые базы (например, гадкий INFORMIX) могут кушать ДатуВремя как в одинарных, так и в двойных кавычках, в каком-то из случаев у вас получится неприятная ситуация.


Название: Re: Пошаговая инструкция. Работа с базой данных SQLite на Qt C++
Отправлено: Johnik от Март 19, 2014, 09:05
Из бесплатных клиентов вот еще есть вполне неплохой: Valentina studio (http://www.valentina-db.com/en/valentina-studio-overview) и его обзор на хабре (http://habrahabr.ru/post/181990/)