Как связать 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 {
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
ЗдравствуйтеНедавно получил задание от друга, создать простую программу, которая поможет работать ему с другой программой
Доброго времени сутокЕсть задание: реализовать программу, которая меняет местами последнюю строку и первый столбик квадратной матрицы