Anwendungseinstellungen lesen
Anwendungseinstellungen werden in der Optionstabelle der SQLite-Datenbank iMpos.opt gespeichert.
Um Optionswerte zu erhalten und festzulegen, erstellen wir die Options-Klasse und implementieren die entsprechenden Methoden darin.
Optionen.h
#ifndef OPTIONS_H #define OPTIONS_H #include <QObject> #include <QSqlQuery> #include <QSqlError> #include <QVariant> class Options : public QObject { Q_OBJECT public: explicit Options(QObject *parent = nullptr); QVariant getOption(int optionID); //Получение значения опции void setOption(int optionID, QString value); //Установка значения опции signals: public slots: private: QSqlDatabase db; //База Данных }; #endif // OPTIONS_H
options.cpp
#include "options.h" #include "LoggingCategories/loggingcategories.h" Options::Options(QObject *parent) : QObject(parent) { //используем соедиенеие с базой данных options db = QSqlDatabase::database("options"); } QVariant Options::getOption(int optionID) { QSqlQuery q = QSqlQuery(db); q.prepare("SELECT value FROM options WHERE option_id=:optionID"); q.bindValue(":optionID",optionID); if(!q.exec()) { qCritical(logCritical()) << "Не удалось получить значение опции" << optionID << ".Причина" << q.lastError().text(); return QVariant(); } q.next(); return q.value(0); } void Options::setOption(int optionID, QString value) { QSqlQuery q = QSqlQuery(db); q.prepare("UPDATE options SET value = :value WHERE option_ID = :optionID"); q.bindValue(":optionID", optionID); q.bindValue(":value", value); if(!q.exec()) { qCritical(logCritical()) << "Не удалось обновить опцию" << optionID << "Причина" << q.lastError().text(); } }
Wir binden die Header-Dateien options.h und logindialog.h in main.cpp ein und fügen den folgenden Code hinzu, bevor wir das Hauptfenster aufrufen.
Options opt; //Проверяем значение опции 1000 if(opt.getOption(1000).toBool()){ //Создаем диалогвое окно LoginDialog *loginDlg = new LoginDialog(); loginDlg->exec(); //Если вход не состоялся завершаем работу программы if(loginDlg->result() == QDialog::Rejected){ QMessageBox::critical(nullptr,"Ошибка входа", "Не выполнен вход в систему!<br>Дальнейшая работа не возможна."); qCritical(logCritical()) << "Не выполнен вход в систему. Закрытие программы."; return 1; } }
Wir setzen den Wert der Option 1000 auf true, um die Optionstabelle zu überprüfen. Wir starten das Programm.
Der Dialog wird aufgerufen, und wenn er geschlossen wird, endet das Programm.
Implementierung des Benutzer-Login-Dialogs.
Ich möchte auf die Erstellung einer Reihe von Signal-Slot-Steuerelementen mit Qt Designer achten.
Öffnen Sie unser Formular, klicken Sie mit der rechten Maustaste auf das comboBoxUser-Objekt, wählen Sie
Go to Slot...
. Wählen Sie das aktivierte (int) Signal.
Und sofort bekommen wir die Implementierung des Slots. Alle anderen Manipulationen werden für uns durchgeführt.
void LoginDialog::on_comboBoxUser_activated(int index) { }
logindialog.h
#ifndef LOGINDIALOG_H #define LOGINDIALOG_H #include <QDialog> #include <QSqlTableModel> #include <QSqlRecord> #include <QSqlError> namespace Ui { class LoginDialog; } class LoginDialog : public QDialog { Q_OBJECT public: explicit LoginDialog(QWidget *parent = nullptr); ~LoginDialog(); private slots: void on_comboBoxUser_activated(int idx); void on_buttonBox_rejected(); void on_buttonBox_accepted(); private: void createUI(); //Первоначальные настройки приложения void createModel(); //Создание модели пользователей private: Ui::LoginDialog *ui; QSqlTableModel *modelUsers; //Модель данных пользователей int userID; //ID выбранного пользователя QString userPass; //Пароль выбранного пользователя из базы данных }; #endif // LOGINDIALOG_H
logindialog.cpp
#include "logindialog.h" #include "ui_logindialog.h" #include "LoggingCategories/loggingcategories.h" LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LoginDialog) { ui->setupUi(this); createModel(); createUI(); } LoginDialog::~LoginDialog() { delete ui; } void LoginDialog::createUI() { //Очишаем информационное сообщение ui->labelInfo->clear(); //Связываем модель и comboBox ui->comboBoxUser->setModel(modelUsers); //Устанавливаем отображение в comboBox столбца с номером 1 ui->comboBoxUser->setModelColumn(1); //Текущий индекс -1 т.е. ничего не выбрано ui->comboBoxUser->setCurrentIndex(-1); } void LoginDialog::createModel() { //Используем соединение с базой данный options QSqlDatabase db = QSqlDatabase::database("options"); modelUsers = new QSqlTableModel(this,db); modelUsers->setTable("users"); modelUsers->select(); } void LoginDialog::on_comboBoxUser_activated(int idx) { userPass.clear(); //Очищаем переменную с паролем... //Получаем данные из модели userID = modelUsers->data(modelUsers->index(idx,0)).toInt(); userPass = modelUsers->data(modelUsers->index(idx,2)).toString(); } void LoginDialog::on_buttonBox_rejected() { this->reject(); } void LoginDialog::on_buttonBox_accepted() { if(ui->comboBoxUser->currentIndex()>=0) { if(userPass==ui->lineEditPass->text().trimmed()) { qInfo(logInfo()) << QString("Пользователь: %1. Успешный вход в систему.").arg(ui->comboBoxUser->currentText()); this->accept(); } else { ui->labelInfo->setText("Не верный пароль!"); qWarning(logInfo()) << QString("Пользователь: %1. Не верный пароль!.").arg(ui->comboBoxUser->currentText()); ui->lineEditPass->clear(); } } }
Wir starten die Anwendung. Der Anmeldedialog erscheint. Wenn das Passwort nicht korrekt ist, wird eine Meldung angezeigt. Wenn Sie das richtige Passwort eingeben, wird das Hauptprogrammfenster gestartet.
Projektarchiv
iMposCh005.zip
Aktueller Projektstatus hier.