Проект iMpos. Часть 006. Подключение к центральной базе Fierbird. Диалог настройки подключения к ЦБ.

QDialog, FireBird, QSettings, QIBASE, Qt

Диалог настроек подключения к ЦБ

Хранить настройки подключения будем с использованием QSettings в текстовом файле, т.е. используя QSettings::IniFormat. В класс DataBases добавим метод bool connectCenralDB() в котором и реализуем подключение.
Если попытка подключения не удачна вызываем диалог настроек подключения ConnectionSettingDialog в котором возможно изменение настроек.

connectionsettingdialog.h

#ifndef CONNECTIONSETTINGDIALOG_H
#define CONNECTIONSETTINGDIALOG_H

#include <QDialog>

namespace Ui {
class ConnectionSettingDialog;
}

class ConnectionSettingDialog : public QDialog
{
    Q_OBJECT

public:
    explicit ConnectionSettingDialog(QWidget *parent = nullptr);
    ~ConnectionSettingDialog();

private slots:
    void on_buttonBox_accepted();

    void on_buttonBox_rejected();

private:
    Ui::ConnectionSettingDialog *ui;
private:
    void readConnData();    //Чтение настроек подключения
    void saveConnData();    //Запись настроек подключения
};

#endif // CONNECTIONSETTINGDIALOG_H

connectionsettingdialog.cpp

#include "connectionsettingdialog.h"
#include "ui_connectionsettingdialog.h"
#include "LoggingCategories/loggingcategories.h"
#include "DataBases/databasesettings.h"
#include <QSettings>

ConnectionSettingDialog::ConnectionSettingDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ConnectionSettingDialog)
{
    ui->setupUi(this);
    readConnData();
    qInfo(logInfo()) << "Открытие диалога настройки подключения.";
}

ConnectionSettingDialog::~ConnectionSettingDialog()
{
    delete ui;
}

void ConnectionSettingDialog::readConnData()
{
    QSettings settings(DataBaseSettings::CONFIG_FILE_NAME,QSettings::IniFormat);
    settings.beginGroup("DATABASE");
    ui->lineEditServer->setText(settings.value("HostName").toString());
    ui->lineEditDatabase->setText(settings.value("DataBase").toString());
    ui->lineEditUser->setText(settings.value("User").toString());
    ui->lineEditPassword->setText(settings.value("Password").toString());
    settings.endGroup();
}

void ConnectionSettingDialog::saveConnData()
{
    QSettings settings(DataBaseSettings::CONFIG_FILE_NAME,QSettings::IniFormat);
    settings.beginGroup("DATABASE");
    settings.setValue("HostName",ui->lineEditServer->text().trimmed());
    settings.setValue("DataBase",ui->lineEditDatabase->text().trimmed());
    settings.setValue("User",ui->lineEditUser->text().trimmed());
    settings.setValue("Password",ui->lineEditPassword->text().trimmed());
    settings.endGroup();
}

void ConnectionSettingDialog::on_buttonBox_accepted()
{
    saveConnData();
    this->accept();
}

void ConnectionSettingDialog::on_buttonBox_rejected()
{
    this->reject();
}

Mетод bool connectCenralDB()

bool DataBases::connectCenralDB()
{
    bool result = true;
    //Указываем имя файла настроек
    QSettings settings(DataBaseSettings::CONFIG_FILE_NAME, QSettings::IniFormat);
    //Создаем подключение по умолчанию к базе данных FireBird
    QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE");

    //Установка параметров подключения из файла настроек
    settings.beginGroup("DATABASE");
    db.setHostName(settings.value("HostName").toString());
    db.setDatabaseName(settings.value("DataBase").toString());
    db.setUserName(settings.value("User").toString());
    db.setPassword(settings.value("Password").toString());
    settings.endGroup();
    //Открываем базу данных, если попытка не удачная вызываем диалог настроек подключения
    if(!db.open()) {
        qCritical(logCritical()) <<  "Не возможно подключиться к базе данных." << endl << "Причина:" << db.lastError().text();
        int rez = QMessageBox::question(nullptr, QObject::tr("Ошибка подключения"),
                              "Не могу установить соединение с базой данных.\nПроверить настройки подключения?",
                              QMessageBox::Yes | QMessageBox::No);
        if(rez == QMessageBox::Yes) {
            ConnectionSettingDialog *connDlg = new ConnectionSettingDialog();
            int result = connDlg->exec();
            if(result == QDialog::Accepted) {
                qInfo(logInfo()) << "Сохранение настроек подключения.";
            }
        }
        //Завершаем работу
        result = false;
    } else {
        qInfo(logInfo()) << "Успешное подключение к центральной базе данных.";
        result = true;
    }

    return result;

}

В main.cpp перед вызовом основного окна добавляем

    if(!db->connectCenralDB()){
        qInfo(logInfo()) << "Завершение работы. Не удалось подключится к центральной базе.";
        return 1;
    }

Запускаем приложение.
Появляется сообщение

После нажатия кнопки Да отобразится окно настроек подключения. Заполняем его.

Программа закрывается. В каталоге сборки проекта появляется файл с настройками.
iMpos.config

[DATABASE]
HostName=192.168.123.11
DataBase=sunoil
User=SYSDBA
Password=sunoil00

При следуем запуске происходит чтение настроек и подключение к центральной базе данных.

Архив проекта:

iMposCh006.zip iMposCh006.zip

10% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking

Такой вид диалоговых окон на десятой винде?

Да, такой вид.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

D
Aug. 16, 2019, 11:58 a.m.
Damir

C++ - Тест 003. Условия и циклы

  • Result:92points,
  • Rating points8
D
Aug. 16, 2019, 11:46 a.m.
Damir

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
u
Aug. 14, 2019, 1:55 p.m.
unrealproro

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
Aug. 19, 2019, 6:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
Aug. 18, 2019, 5:09 a.m.
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
Aug. 17, 2019, 8:04 a.m.
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 12:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 11:16 a.m.
Dmitrij

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 21, 2019, 2:16 a.m.
nayk1982

Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант: 1. Получить список таблиц через QSqlDatabase::tables 2. Для каждой табли…
Aug. 21, 2019, 12:31 a.m.
grig_p

Спасибо большое. Я долгое время писал на Object Pascal, привык, что там любое исключение, а не только сгенерированное самостоятельно, может быть перехвачено и обработано в блоках try. Дело …
Aug. 20, 2019, 1:10 p.m.
Mihailll

Нужно будет попробовать подставть другой тип данных, может заработае validator: IntValidator {bottom: 1; top: 99999999999}
Aug. 20, 2019, 12:37 p.m.
Aleksandr Panjushkin

Добрый день. Я бы хотел добавить, что в вашем коде можно было бы использовать слово auto и цикл for с перебором. Так код получился бы компактнее: auto map = new QMap<Qstring, QString&…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB