我刚刚开始使用 Qt,并试图获得模型-视图-控制器设计模式的简化工作示例。
到目前为止,我已经能够使用信号和插槽将按钮等基本小部件连接到 a QLabel
,并在单击/释放按钮时修改视图。请参阅下面的代码以获取其工作示例(在MainWindow
类中实现)。
我正在尝试定义一个类,在这种情况下,Game
它将成为我的模型。我想Game
拥有整个应用程序的所有数据和业务规则。我不要求它Game
是特定于 Qt 的——它很可能是通用 C++。然而,在下面的代码中,它确实有一些特定于 Qt 的代码来实现 aQTimer
这对于本示例的目的很有用。
我试图在这个例子中实现两件事:
- 我想要一个模型,它能够在自身内部产生某种事件,比如随着时间的推移增加一个变量值,然后最终看到这种变化以某种方式反映在视图中。或者更好的是,
timeout()
的QTimer
可能只是连接到某个插槽的信号,该插槽是模型中发生的某个事件。使用下面显示的代码,视图中的反射将是label_1
(MainWindow
类的一部分)的设置,以显示已经存储在imageOn
或imageOff
(也是MainWindow
类的一部分)中的图像之一。 on_pushButton_clicked()
我希望与和插槽相关联的按钮on_pushButton_pressed()
能够修改存储在模型中的某些值。然后,与第 1 项一起循环,让模型的更新反映在视图中。
如果到目前为止我的术语不正确或与 MVC 设计模式的 Qt 术语不一致,请见谅。我欢迎对此作出任何澄清。此外,如果我提供的示例代码过于复杂,无法在 Qt 中举例说明 MVC 设计模式,我非常愿意擦干净石板并从更合适的示例开始。我想做的只是开始使用 Qt 和 MVC,但以一种处理更复杂数据类型的方式。
我正在尝试开发一个示例,在该示例中我可以处理可能很复杂的模型和类Game
——而不是简单的 QString 列表或保证更直接的东西。当我浏览与 MVC 相关的 Qt 文档时,我遇到了很多示例,这些示例使用该setModel()
函数来尝试建立我在列表项 1 和 2 中基本上概述的连接。问题是我看不到一种方法使用具有更复杂数据类型的确切方法,例如Game
可能是完整应用程序的整个数据模型(我知道Game
在此示例中并不复杂,但最终可能会如此)。我需要一些可扩展和可扩展的东西,一些适用于整个应用程序的东西。如果那些setModel()
-type 函数适用于此-它们很可能是,我只是无法自己弄清楚-我想知道如何实现本示例中处理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
游戏.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()));
}
主窗口.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
主窗口.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));
}
主文件
#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();
}