2012-11-16 12 views
8

私はちょうどQtを使い始めており、モデルビューコントローラの設計パターンの簡単で​​実用的な例を得ようとしています。Qtモデル/ビュー/コントローラの例

これまでは、信号とスロットを使用して、プッシュボタンのような基本ウィジェットをQLabelに接続し、プッシュボタンがクリック/リリースされるとビューが変更されました。その実例は下記のコードを参照してください(MainWindowクラスで実装されています)。

クラスを定義しようとしています。この場合、Gameが私のモデルになります。 Gameに私のアプリケーション全体のデータとビジネスルールをすべて持たせたいと思います。私はGameがQt特有のものである必要はありません - それは非常によく一般的なC++かもしれません。ただし、以下のコードでは、この例の目的に役立つQTimerを実装するためのQt固有のコードがあります。

私は、この例では二つのことを達成しようとしています:

  1. 私は時間の経過にわたり変数の値をインクリメントするように、自身の中に何らかのイベントを生成することができるモデルを持つようにしたいです、最終的にはその変化が何とか視点に反映されているのを見ることができます。あるいは、より良いことに、QTimertimeout()は、単に、あるスロットに接続されている信号であってもよく、そのスロットはモデル内で発生するイベントである。下に示すコードを使用すると、ビュー内のリフレクションは、既にimageOnまたはimageOff(またはMainWindowクラスの一部)に格納されているイメージの1つを表示するようにlabel_1MainWindowクラスの一部)の設定になります。
  2. 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に

+0

Qtはモデルビューアプローチを使用していますが、別のコントローラはありません。あなたは、Qtのモデルビューのものを使用しようとしているのですか、独自のMVCをロールバックしていますか?次に、実際の質問は何ですか? – hyde

+0

私はMVCのものをロールバックするのではなく、Qtモデルビューのもののコストとメリットについてはわかりませんが、そのためにはグレインに対して何らかの理由で作業することはできません。私はそれがQtのモデルビューのものを使いたいということです。私はコントローラをミックスに強制しようとしていません。私はQtがネイティブに別個のコントローラではなかったことを知らなかった。 – nairware

+0

一般的な見解(私が読んだところから)は、便利なウィジェットが小さなものに適しているということです。ビュー/標準モデルは、1つのデータモデルとその同じデータの多数のビューを必要とする場合に最適です...そして最後に、独自のデータ構造を表す巨大なデータセットを行う必要がある場合、カスタムモデルがそこにありますそのようなパフォーマンスのために。 – jdi

答えて

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

"コントローラ" は、技術的にだけスロットを含む、別QObjectサブクラスによって表すことができます。そして、あなたはモデルとビューの間でこれを結ぶでしょう。
しかし、通常はあなたのモデルにビジネスロジックが含まれ、ビューのサブクラスにはユーザーのやりとりを処理するためのメソッドが含まれています。私がコントローラのコンセプトに最も近いのは、アプリケーションを表すQMainWindow(またはダイアログ)クラスがあり、その上にSLOTSの束があるときです。これらのスロットは、プライベートUIメンバの信号に接続され、それらを一緒に接続します。

例:メインウィンドウには、モデル、ビュー、およびプッシュボタンがあります。メインウィンドウのinitでは、ビュー内にモデルを設定し、プッシュボタンをウィンドウのスロットに「クリック」接続しますrefreshData()。このスロットは、モデル上の「更新」メソッドを呼び出し、自動的にビューに伝播します。したがって、メインウィンドウはコントローラのように動作します。

あなたのデータを表すQAbstractItemModelまたはQStandardItemModelのいくつかのタイプを作成し、そのデータを更新することをお勧めします(あなたが提案したようなタイマー)。モデルに接続されているビューは、標準インタフェースのためにモデルを見ることができます。また、単にあなたがしようと挑戦することができますカスタムモデルに飛び込む、@hydeによって指摘カスタムQAbstractItemModelクラス

約既存QStandardItemModel

ノートにデータを置く独立したタイマーを作ることができます既存の具体的なモデルクラスをよく理解する前にまずそれを行います。

  1. が次に続いて最後に
  2. QTreeViewと連携QListView/QTableView
  3. でQStandardItemModelを使用してみてください便利なウィジェット(QListWidget、QTableWidget、QTreeWidget)
  4. に精通取得:ここで私はやってお勧めするものです既存のデータ構造に対して非常にカスタムのモデリングが本当に必要な場合は、QAbstractItemModelをサブクラス化して独自の内部構造を使用できるようにすることができます。
+2

QAbstractItemModelに関する1つのコメント:間違いなく、最も複雑な部分の1つです。最初のモデルを最初からやっているときには、Qtは、髪を引っ張ったり、慎重に読んだりするのに適しています。 – hyde

+0

それはちょうど主観的な経験かもしれません。既存の具体的なモデルを最初に理解することなくすぐに開始するのは、複雑な作業です。これらの仕組みが分かれば、単純な読み取り専用のカスタムモデルを簡単に作成できます。私はいくつかの情報で更新します。ありがとう! – jdi

+0

To-doリストをありがとう。私はそれを開始し、より良い基礎を持って帰るつもりです。 – nairware

関連する問題