Ejemplo de modelo / vista / controlador de Qt

Acabo de comenzar en Qt y estoy tratando de obtener un ejemplo simplificado y funcional del patrón de diseño del modelo de vista y controlador.

Hasta ahora, he podido usar señales y ranuras para conectar widgets básicos como botones pulsadores a unQLabel, y hacer que la vista se modifique a medida que se hace clic o se suelta el botón. Vea el código a continuación para ver un ejemplo práctico de eso (implementado en elMainWindow clase).

Estoy tratando de definir una clase, en este caso,Game, que va a ser mi modelo. quieroGame tener todos los datos y reglas de negocio de toda mi aplicación. No requiero esoGame Sea algo Qt específico - muy bien podría ser genérico C ++. Sin embargo, en el código a continuación, tiene un código específico de Qt para implementar unQTimer que es útil para los propósitos de este ejemplo.

Estoy tratando de lograr dos cosas en este ejemplo:

Quiero tener un modelo que sea capaz de generar algún tipo de evento dentro de sí mismo, como incrementar un valor variable a lo largo del tiempo, y luego ver ese cambio de alguna manera reflejado en la vista. O mejor aún, eltimeout() delQTimer podría ser simplemente la señal que está conectada a alguna ranura, esa ranura es un evento que tiene lugar dentro del modelo. Usando el código que se muestra a continuación, la reflexión en la vista sería la configuración delabel_1 (parte deMainWindow clase) para mostrar una de las imágenes ya almacenadas enimageOn oimageOff (también parte de laMainWindow clase).Quiero tener el pulsador asociado a laon_pushButton_clicked() yon_pushButton_pressed() Las ranuras podrán modificar algún valor almacenado dentro del modelo. Luego, completando el círculo con el elemento 1, haga que la actualización del modelo se refleje en la vista.

Si mi terminología hasta ahora es incorrecta o inconsistente con la terminología Qt del patrón de diseño MVC, perdóneme. Me gustaría cualquier aclaración sobre eso. Además, si el código de ejemplo que he proporcionado es demasiado complicado para ejemplificar el patrón de diseño MVC en Qt, estoy más que dispuesto a limpiar la pizarra y comenzar con un ejemplo más apropiado. Todo lo que estoy tratando de hacer es comenzar con Qt y MVC, pero de una manera que trata con tipos de datos más complejos.

Estoy tratando de desarrollar un ejemplo en el que pueda manejar un modelo y una clase comoGame lo que es potencialmente complejo, no una simple lista de QStrings o algo que se garantice que sea más sencillo. Cuando exploré la documentación de Qt relacionada con MVC, encontré muchos ejemplos que usabansetModel() función para intentar establecer las conexiones que esencialmente describo en los elementos de la lista 1 y 2. El problema era que no podía ver una forma de utilizar ese enfoque exacto con un tipo de datos más complejo comoGame que podría ser el modelo de datos completo para una aplicación completa (lo séGame no es complejo en este ejemplo, pero podría ser eventualmente). Necesito algo que sea escalable y extensible, algo que funcione para una aplicación completa. Si esossetModel()Las funciones de tipo son adecuadas para esto, lo que muy probablemente podrían ser, simplemente no pude resolverlo por mi cuenta. Me gustaría saber cómo implementar aquellas en este ejemplo que tratan conQLabel e imagenes

Código:

game.h

#ifndef GAME_H
#define GAME_H

#include <QtCore>

class Game : public QObject {

    Q_OBJECT

public:
    Game();
    void timed_job();

private:
    QTimer *timer;
};

#endif // GAME_H

game.cpp

#include "game.h"
#include <QtCore>

Game::Game() {
}

void Game::timed_job() {
    timer = new QTimer(this);
    timer->start(1000);
    //connect(timer, SIGNAL(timeout()), this, SLOT(flip()));
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void on_pushButton_pressed();

private:
    Ui::MainWindow *ui;
    QImage imageOn, imageOff;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include <QImage>
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow) {
    imageOn.load(":/Files/On.jpg");
    imageOff.load(":/Files/Off.jpg");

    ui->setupUi(this);
}

MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::on_pushButton_clicked() {
    ui->label_1->setPixmap(QPixmap::fromImage(imageOff));
}

void MainWindow::on_pushButton_pressed() {
    ui->label_1->setPixmap(QPixmap::fromImage(imageOn));
}

main.cpp

#include <QtGui/QApplication>
#include <QLabel>
#include "mainwindow.h"
#include "game.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    MainWindow w;

    w.show();

    return a.exec();
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta