Задать вопрос
@futuarmo
погромист

Как организовать классы с точки зрения архитектуры?

Добрый день! При написании программы на Qt возник такой вопрос по архитектуре.
Пишу объект, который представляет собой страницу залогинивания на сервис. Планировал сделать класс LoginScreen (типа как контроллер), внутри которого указатель на объект (LoginScreenForm *form)(вид), который содержит готовый дизайн на виджетах
LoginScreen должен был иметь методы
QString getID();
QString getPass();
void logIn(QSettings *settings).
LoginScreen
#ifndef LOGINSCREEN_H
#define LOGINSCREEN_H
#include "loginscreenform.h"
#include <QSettings>
class LoginScreen : public QWidget
{
    Q_OBJECT
public:
    LoginScreen(LoginScreenForm *form);
signals:
    void enter();
public slots:
    QString getID();
    QString getPass();
    void logIn(QSettings *settings); //!< Вход на сайт с сохранением ID и пароля в настройки
    void close(); //!< Закрывает (скрывает) текущий QWidget
private:
    LoginScreenForm *form;
};

Сигнал enter(), который подается при нажатии кнопки "Войти"
Но при написании столкнулся с тем, что классу LoginScreen за всеми данными (ID, пароль) приходится лезть к членам LoginScreenForm, а так как те - приватные, в LoginScreenForm придется делать те же методы:
QString getID();
QString getPass()
и сигнал enter().
LoginScreenForm
#ifndef LOGINSCREENFORM_H
#define LOGINSCREENFORM_H
#include <QWidget>
#include <QApplication>
#include <QDesktopWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
class LoginScreenForm : public QWidget
{
    Q_OBJECT
public:
    explicit LoginScreenForm(QLabel *id, QLineEdit *idLine, QLabel *password, QLineEdit *passwordLine, QPushButton *enter, QVBoxLayout *box, QHBoxLayout *enterBox, QWidget *parent = 0);
    enum ScreenOrientation {
        ScreenOrientationLockPortrait, //!< Портретная
        ScreenOrientationLockLandscape, //!< Ландшафтная
        ScreenOrientationAuto //!< Автоматическая
    };
    void setOrientation(ScreenOrientation orientation);
    void showExpanded();
    QString getID();
    QString getPass();
signals:
    void enter();
private:
    void resizeEvent(QResizeEvent * event);
    void SetScreenSizeAndPosition();
    QLabel *id; //!< Надпись "Введите ID"
    QLineEdit *idLine; //!< Поле для ввода ID
    QLabel *password; //!< Надпись "Пароль"
    QLineEdit *passwordLine; //!< Поле для ввода пароля
    QPushButton *enter; //!<Кнопка "Войти"
    QVBoxLayout *box; //!< Вертикальный лайоут для всех виджетов
    QHBoxLayout *enterBox; //!< Горизонтальный лайаут для кнопки "Войти" и спейсера

};
#endif // LoginScreenForm_H

То есть получается внутренний объект перенаправляет данные родителю, а тот уже запрашивающему объекту.

Правилен ли такой подход с точки зрения архитектуры? Если нет, то как как поступить?
  • Вопрос задан
  • 468 просмотров
Подписаться 4 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Zifix
@Zifix Куратор тега Qt
Barbatum
Такую простую штуку нужно делать просто в классе формы и не морочить голову с архитектурой там, где этого не требуется.
Ответ написан
@jk_action
Разработчик С++ и JavaScript
Простой подход передавать в enter данные формы enter(LoginData& data).
Сложный покурить как MVC реализуется в QT(сам пробовал так и не раскурил до конца).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы