Informationen über den aktuellen Benutzer speichern
Nach dem Öffnen des Hauptfensters der Anwendung möchte ich, dass in der Statusleiste der Name des aktuellen Benutzers und Informationen zur Verbindung mit der zentralen Datenbank angezeigt werden.
Ich wollte auch die Rechte des Benutzers auf einige Aktionen einschränken. Jene. Ein Benutzer mit einer anderen usder_id als 1 hatte Zugriff auf die eingeschränkte Funktionalität der Anwendung.
Um die ID des aktuellen Benutzers zu speichern, fügen Sie Option 1020 hinzu. Fügen Sie dazu eine weitere Anfrage zur Methode
DataBases::connectOptions()
hinzu, um eine Option zu erstellen.
listSQL << "INSERT INTO `options`(`option_id`,`value`,`comment`) VALUES (1020, '1', 'Текущий пользователь системы')";
Wenn Sie den Parameter 1000 (Authentifizierung verwenden) ändern, müssen Sie die aktuelle Benutzer-ID auf 1 setzen. D.h. wenn das Passwort nicht abgefragt wird, arbeitet das System mit Administratorrechten. Wenn die Datenbank dies tun kann, lassen Sie sie es tun, damit wir SQLite anweisen, den Wert des gesetzten Parameters zu überwachen.
Fügen Sie dazu der Datenbank einen Trigger hinzu, der den Wert von Option 1000 überwacht:
listSQL << "CREATE TRIGGER use_login AFTER UPDATE " "ON options WHEN (SELECT value FROM options WHERE option_id =1000) = 'false' OR (SELECT value FROM options WHERE option_id =1000) = 0 " "BEGIN " "UPDATE options SET value = 1 WHERE option_id= 1020; " "END";
Wenn der Wert auf „false“ oder 0 gesetzt ist, wird die Benutzer-ID auf 1 zurückgesetzt.
Fügen wir der Optionstabelle einen Eintrag mit der Benutzer-ID des erfolgreich angemeldeten Benutzers hinzu.
void LoginDialog::on_buttonBox_accepted() { if(ui->comboBoxUser->currentIndex()>=0) { if(userPass==ui->lineEditPass->text().trimmed()) { qInfo(logInfo()) << QString("Пользователь: %1. Успешный вход в систему.").arg(ui->comboBoxUser->currentText()); //Запись в таблицу options ID пользователя Options opt; opt.setOption(1020,QString::number(userID)); this->accept(); } else { ui->labelInfo->setText("Не верный пароль!"); qWarning(logInfo()) << QString("Пользователь: %1. Не верный пароль!.").arg(ui->comboBoxUser->currentText()); ui->lineEditPass->clear(); } } }
Verbindungs- und aktuelle Benutzerinformationen anzeigen
Informationen über den aktuellen Benutzer und die Verbindung zur Datenbank werden in der Statusleiste des Hauptfensters angezeigt.
Die Methode void createUI() führt die anfängliche Einrichtung des Aussehens des Hauptfensters durch, wir nennen sie im MainWindow-Konstruktor.
void MainWindow::createUI() { //Создаем два QLabels которые поместим в StatusBar QLabel *labelUsers = new QLabel(); QLabel *labelConnections = new QLabel(); //Получаем данные о текущем пользователе QSqlDatabase db = QSqlDatabase::database("options"); QSqlQuery q = QSqlQuery(db); q.exec("SELECT u.fio FROM users u " "INNER JOIN options o ON u.user_id = o.value " "WHERE o.option_id = 1020"); q.next(); labelUsers->setText("Пользователь: "+q.value(0).toString()); //Получаем данные о текущем подключении QSqlDatabase dbcentr = QSqlDatabase::database(); labelConnections->setText("База данных:"+dbcentr.hostName()+":"+dbcentr.databaseName()); //Добавляем виджеты в строку состояния //Нормальное сообщение ui->statusBar->addWidget(labelUsers); //Постоянное сообщение ui->statusBar->addPermanentWidget(labelConnections); }
Menüerstellung
Öffnen Sie das Formular mainwindow.ui.
An Stelle
Hier schreiben
schreiben wir den Namen des Menüs der obersten Ebene: Tools
Unten ist der Name des Menüpunkts: Optionen...
Die Menü- und Aktionsobjekte werden der Objektliste hinzugefügt und der Aktionseditor wird unten angezeigt.
Geben wir den Objekten aussagekräftige Namen. Danach doppelklicken Sie im Aktionseditor und das Aktionseinstellungsfenster wird geöffnet.
Darin legen wir das Symbol für das Menü fest, das zuvor den Ressourcen und dem Hotkey hinzugefügt wurde.
Ziehen Sie danach die Aktion in die Symbolleiste des Hauptfensters.
Klicken Sie mit der rechten Maustaste auf die Aktion und wählen Sie Gehe zum Slot. Uns interessiert der triggered() Slot. Wir erhalten einen Slot, der bereits mit der Auswahl eines Menüpunkts oder dem Drücken einer Schaltfläche in der Symbolleiste verknüpft ist.
void MainWindow::on_actionSettings_triggered() { }
Einstellungsdialog
Erstellen Sie eine neue Formularklasse Qt Designer SettingsDialog. Im Ressourceneditor fügen wir die notwendigen Steuerelemente hinzu, geben ihnen aussagekräftige Namen und führen das Layout durch.
In MainWindow::on_actionSettings_triggered() rufen wir den Dialog auf, nachdem wir die Header-Datei der Dialogklasse eingebunden haben.
void MainWindow::on_actionSettings_triggered() { //Создаем объект диалога SettingsDialog *settingsDlg = new SettingsDialog(); //позиционируем диалог по центру главного окна settingsDlg->move(this->geometry().center().x() - settingsDlg->geometry().center().x(), this->geometry().center().y() - settingsDlg->geometry().center().y()); //Отображаем диалог settingsDlg->exec(); }
Wir überprüfen.
Implementierung des Einstellungsdialogs:
settingsdialog.h
#ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include "DataBases/options.h" #include <QDialog> namespace Ui { class SettingsDialog; } class SettingsDialog : public QDialog { Q_OBJECT public: explicit SettingsDialog(QWidget *parent = nullptr); ~SettingsDialog(); private slots: void on_buttonBox_accepted(); private: Ui::SettingsDialog *ui; Options opt; //чтение запись таблицы options private: void createUI(); //Настройка первоначального интерфейса }; #endif // SETTINGSDIALOG_H
settingsdialog.cpp
#include "settingsdialog.h" #include "ui_settingsdialog.h" SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog) { ui->setupUi(this); createUI(); } SettingsDialog::~SettingsDialog() { delete ui; } void SettingsDialog::createUI() { //Устанавливаем сотояния в зависимости от значений в таблице ui->checkBoxLogin->setChecked(opt.getOption(1000).toBool()); ui->checkBoxRegions->setChecked(opt.getOption(1010).toBool()); } void SettingsDialog::on_buttonBox_accepted() { //Записываем в таблицу состояние opt.setOption(1000,QVariant(ui->checkBoxLogin->isChecked()).toString()); opt.setOption(1010,QVariant(ui->checkBoxRegions->isChecked()).toString()); }
Projektdatei:
iMposCh007.zip
Aktueller Stand des Projekts
https://github.com/rust3128/iMpos