Qt-Modell / Ansicht / Controller-Beispiel

Ich fange gerade mit Qt an und versuche, ein vereinfachtes, funktionierendes Beispiel für das Entwurfsmuster des Model-View-Controllers zu finden.

Bisher konnte ich mithilfe von Signalen und Slots grundlegende Widgets wie Drucktasten mit einem verbindenQLabel, und lassen Sie die Ansicht ändern, wenn der Druckknopf gedrückt / losgelassen wird. Ein funktionierendes Beispiel dafür finden Sie im folgenden Code (implementiert in derMainWindow Klasse).

Ich versuche, eine Klasse zu definieren, in diesem Fall,Game, das wird mein Modell sein. Ich willGame alle Daten und Geschäftsregeln meiner gesamten Anwendung zu haben. Das brauche ich nichtGame Sei alles Qt-spezifisch - es könnte sehr gut generisches C ++ sein. Im folgenden Code gibt es jedoch einen Qt-spezifischen Code zum Implementieren von aQTimer Das ist nützlich für die Zwecke dieses Beispiels.

In diesem Beispiel versuche ich zwei Dinge zu erreichen:

Ich möchte ein Modell haben, das in der Lage ist, eine Art Ereignis in sich selbst zu generieren, wie das Inkrementieren eines variablen Werts im Laufe der Zeit, und dann diese Änderung letztendlich irgendwie in der Ansicht wiederzugeben. Oder noch besser, dietimeout() desQTimer könnte einfach das Signal sein, das mit einem Steckplatz verbunden ist, wobei dieser Steckplatz ein Ereignis ist, das innerhalb des Modells stattfindet. Wenn Sie den unten gezeigten Code verwenden, entspricht die Reflektion in der Ansicht der Einstellung vonlabel_1 (Teil derMainWindow Klasse), um eines der Bilder anzuzeigen, die bereits in gespeichert sindimageOn oderimageOff (auch Teil derMainWindow Klasse).Ich möchte den Druckknopf mit dem verknüpfenon_pushButton_clicked() undon_pushButton_pressed() Slots können einen im Modell gespeicherten Wert ändern. Wenn sich dann der Kreis mit Punkt 1 schließt, muss sich diese Aktualisierung des Modells in der Ansicht widerspiegeln.

Wenn meine bisherige Terminologie falsch ist oder nicht mit der Qt-Terminologie des MVC-Entwurfsmusters übereinstimmt, verzeihen Sie mir. Ich würde es begrüßen, wenn dies präzisiert würde. Wenn der Beispielcode, den ich bereitgestellt habe, zu kompliziert ist, um das MVC-Entwurfsmuster in Qt zu veranschaulichen, bin ich mehr als bereit, den Schiefer sauber zu wischen und mit einem geeigneteren Beispiel zu beginnen. Ich versuche nur, mit Qt und MVC zu beginnen, aber auf eine Weise, die mit komplexeren Datentypen umgeht.

Ich versuche ein Beispiel zu entwickeln, in dem ich mit einem Modell und einer Klasse wie zGame Das ist möglicherweise komplex - keine einfache Liste von QStrings oder etwas, das garantiert einfacher ist. Beim Durchsuchen der Qt-Dokumentation zu MVC stieß ich auf viele Beispiele, in denen das verwendet wurdesetModel() Funktion, um zu versuchen, die Verbindungen herzustellen, die ich im Wesentlichen in den Listenpunkten 1 und 2 skizziereGame das könnte das gesamte Datenmodell für eine vollständige Anwendung sein (ich weißGame ist in diesem Beispiel nicht komplex, könnte aber irgendwann sein). Ich brauche etwas, das skalierbar und erweiterbar ist, etwas, das für eine gesamte Anwendung funktionieren würde. Wenn diesesetModel()-type Funktionen sind dafür geeignet - was sie sehr wahrscheinlich sein könnten, ich konnte es einfach nicht alleine herausfinden - ich würde gerne wissen, wie man diese in diesem Beispiel umsetztQLabel und Bilder.

Code:

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()));
}

Hauptfenster.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();
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage