Ruslan Polupan
Ruslan Polupan21. Juli 2019 02:58

IMpos-Projekt. Teil 007. Anzeigen von Informationen über die Verbindung und den aktuellen Benutzer. Menüerstellung. Dialogfeld "Anwendungseinstellungen".

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 iMposCh007.zip
Aktueller Stand des Projekts https://github.com/rust3128/iMpos

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken