私はちょうどQtを使い始めており、モデルビューコントローラの設計パターンの簡単で実用的な例を得ようとしています。Qtモデル/ビュー/コントローラの例
これまでは、信号とスロットを使用して、プッシュボタンのような基本ウィジェットをQLabel
に接続し、プッシュボタンがクリック/リリースされるとビューが変更されました。その実例は下記のコードを参照してください(MainWindow
クラスで実装されています)。
クラスを定義しようとしています。この場合、Game
が私のモデルになります。 Game
に私のアプリケーション全体のデータとビジネスルールをすべて持たせたいと思います。私はGame
がQt特有のものである必要はありません - それは非常によく一般的なC++かもしれません。ただし、以下のコードでは、この例の目的に役立つQTimer
を実装するためのQt固有のコードがあります。
私は、この例では二つのことを達成しようとしています:
- 私は時間の経過にわたり変数の値をインクリメントするように、自身の中に何らかのイベントを生成することができるモデルを持つようにしたいです、最終的にはその変化が何とか視点に反映されているのを見ることができます。あるいは、より良いことに、
QTimer
のtimeout()
は、単に、あるスロットに接続されている信号であってもよく、そのスロットはモデル内で発生するイベントである。下に示すコードを使用すると、ビュー内のリフレクションは、既にimageOn
またはimageOff
(またはMainWindow
クラスの一部)に格納されているイメージの1つを表示するようにlabel_1
(MainWindow
クラスの一部)の設定になります。 on_pushButton_clicked()
およびon_pushButton_pressed()
スロットに関連付けられたプッシュボタンに、モデル内に保存されている値を変更できるようにしたいとします。次に、アイテム1を一周して、そのモデルの更新をビューに反映させます。
これまでの私の用語が正しくないか、MVCデザインパターンのQt用語と矛盾する場合、私を許してください。私はそれについて何らかの明確化を歓迎する。また、QtのMVCデザインパターンを例示するために私が提供したサンプルコードがあまりにも複雑である場合、私はスレートをきれいに拭き取り、より適切な例から始めます。私がしようとしているのは、QtとMVCを使い始めることですが、より複雑なデータ型を扱う方法です。
Game
のような複雑なモデルやクラスを扱うことができる例を開発しようとしています。単純なQStringのリストや、より簡単であることが保証されているものではありません。 MVCに関連するQtのドキュメントを閲覧したところ、setModel()
関数を使用して接続を試してみた例がたくさんありました。リスト項目1と2で概説しています。問題は、 Game
のようなより複雑なデータ型の完全なアプリケーションの完全なデータモデルかもしれません(この例ではGame
は複雑ではありませんが、最終的にはそうかもしれません)。スケーラブルで拡張性のあるものが必要です。アプリケーション全体で機能するものが必要です。もしそれらのsetModel()
型の関数がこれに適しているとすれば、私自身はそれを理解することができませんでした。この例では、QLabel
と画像を扱う方法を実装する方法を知りたいと思います。
コード:
ゲーム。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
Qtの中main.cppに
Qtはモデルビューアプローチを使用していますが、別のコントローラはありません。あなたは、Qtのモデルビューのものを使用しようとしているのですか、独自のMVCをロールバックしていますか?次に、実際の質問は何ですか? – hyde
私はMVCのものをロールバックするのではなく、Qtモデルビューのもののコストとメリットについてはわかりませんが、そのためにはグレインに対して何らかの理由で作業することはできません。私はそれがQtのモデルビューのものを使いたいということです。私はコントローラをミックスに強制しようとしていません。私はQtがネイティブに別個のコントローラではなかったことを知らなかった。 – nairware
一般的な見解(私が読んだところから)は、便利なウィジェットが小さなものに適しているということです。ビュー/標準モデルは、1つのデータモデルとその同じデータの多数のビューを必要とする場合に最適です...そして最後に、独自のデータ構造を表す巨大なデータセットを行う必要がある場合、カスタムモデルがそこにありますそのようなパフォーマンスのために。 – jdi