Сигналы и слоты на Qt и QML

283
19 ноября 2017, 16:10

Как связать QML интерфейс и некий гибрид MVC паттерна ? Суть в том, что есть класс Model и в нем поля string и bool и методы get/set. Для контроля моделями создается класс Controller с методами get/set модели, isEmpty, clear и методом fillModelFromFile(). В QML разбираюсь пока что слабо, только на начальном уровне. Отправлять сигналы от интерфейса и реализовать слоты в классе Controller(все действия и изменения будут в нем) или слоты и изменения должны быть в классе Model? Нужно реализовать интерфейс как на картинке и связать его сигналами/слотами с классами для оповещения про изменения полей string и bool.

Modul.h:

class Model: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString Name READ getName WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(bool State READ getState WRITE setState NOTIFY stateChanged)
public:
    Model(QObject* obj = 0);
    virtual ~Model();
    QString     getName() const;
    bool        getState() const;
    void        setName(const QString& inName);
    void        setState(const bool& inState);
private:
    QString Name;
    bool State;
signals:
    void nameChanged();
    void stateChanged();
};

Modul.cpp:

Model::Model(QObject* obj): QObject(obj)
{ }
Model::~Model()
{ }

QString Model::getName() const
{
    return Name;
}
bool Model::getState() const
{
    return State;
}
void Model::setName(const QString &inName)
{
    if(Name == inName)
        return;
    Name = inName;
    emit nameChanged();
}
void Model::setState(const bool &inState)
{
    State = inState;
    emit stateChanged();
}

Controller.h

    class Controller: public QObject 
{
    Q_OBJECT
public:
    Controller(QObject* obj = 0);
    virtual ~Controller()
{
delete modelField;
}

    void fillModelFromFile();
    bool isEmpty();
    void Clear();
    void        setModel(Model& modelObject);
    Model&      getModel();
private slots:
    void modelFieldsChanged();
    void sizeOfModelChanged();

private:
   Model* modelField;
};

Controller.cpp

Controller::Controller(QObject* obj): QObject(obj), modelField(nullptr)
{
connect(modelField, SIGNAL(nameChanged()), this, 
SLOT(modelFieldsChanged()));
connect(modelField, SIGNAL(stateChanged()), this, 
SLOT(modelFieldsChanged()));
}

void        Controller::setModel(Model& modelObject)
{
    modelField = new Model;
    modelField->setName(modelObject.getName());
    modelField->setState(modelObject.getState());
}
Model&      Controller::getModel()
{
    return *modelField;
}
void Controller::modelFieldsChanged()
{
//некая реакция на изменение значений объекта Model
}
void Controller::sizeOfModelChanged()
{
//некая реакция на изменение размера объекта Model
}

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    qmlRegisterType<Model>("Model", 1, 0, "myModel");// импорт класса в QML
    qmlRegisterType<Controller>("Controller", 1, 0, "myController");//импорт 
   класса в QML
    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    return app.exec();
}

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
// ---
import Model 1.0
import Controller 1.0
// ---

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Task")
    myModul{ //не может распознать класс который импортнули
        id: myObj
        Name: "exemp"
    }
    ListView {
        id: view
        anchors.fill: parent
        anchors.margins: 20
        model: myModel {
        }
        delegate: SwitchDelegate {
        }
    }
}
READ ALSO
C++ работа с другой программой

C++ работа с другой программой

ЗдравствуйтеНедавно получил задание от друга, создать простую программу, которая поможет работать ему с другой программой

245
Генерирование матрицы (C++)

Генерирование матрицы (C++)

Доброго времени сутокЕсть задание: реализовать программу, которая меняет местами последнюю строку и первый столбик квадратной матрицы

248
Как за ХОR&#39;ить (зашифровать) строку?

Как за ХОR'ить (зашифровать) строку?

Ну так for(int i = 0; i < URLlength(); ++i) URL[i] ^=

200