Upload
igor-shkulipa
View
90
Download
0
Embed Size (px)
Citation preview
Темы лекции: Паттерн MVP на Qt.
Практическое задание: Паттерн MVP на Qt.
Тренер: Игорь Шкулипа, к.т.н.
С++ Библиотеки STL и Qt. Занятие 4
http://www.slideshare.net/IgorShkulipa 2
Проект «Окно логина»
http://www.slideshare.net/IgorShkulipa 3
Класс «Модель». Файл model.h
#ifndef MODEL_H
#define MODEL_H
#include <QObject>
#include <QMap>
#include <QString>
class Model: public QObject
{
Q_OBJECT
private:
QMap<QString,QString> usersAndPasswords;
public:
Model();
QList<QString> GetUsers();
QString TryToLogin(QString user, QString password);
};
#endif // MODEL_H
http://www.slideshare.net/IgorShkulipa 4
Класс «Презентер». Файл presenter.h
#ifndef PRESENTER_H
#define PRESENTER_H
#include <QObject>
#include "iview.h"
#include "model.h"
class Presenter: public QObject
{
Q_OBJECT
private:
IView* view;
Model* model;
public:
Presenter();
Presenter(IView* newView);
private slots:
void UpdateUsers();
void Login();
};
#endif // PRESENTER_H
http://www.slideshare.net/IgorShkulipa 5
Интерфейс «Вид». Файл iview.h
#ifndef IVIEW_H
#define IVIEW_H
#include <QString>
#include <QList>
class IView
{
public:
virtual QString GetUser()=0;
virtual QString GetPassword()=0;
virtual void UpdateUsers(QList<QString> users)=0;
virtual void ShowMessage(QString message)=0;
public:
virtual void onLogin()=0;
virtual void onListUpdate()=0;
};
#endif // IVIEW_H
http://www.slideshare.net/IgorShkulipa 6
Реализация интерфейса. Файл mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "iview.h"
namespace Ui { class MainWindow;}
class MainWindow : public QMainWindow, public Iview {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
virtual QString GetUser();
virtual QString GetPassword();
virtual void UpdateUsers(QList<QString> users);
virtual void ShowMessage(QString message);
signals:
void onLogin();
void onListUpdate();
private slots:
void on_pushButton_clicked();
void on_listWidget_activated(const QModelIndex &index);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
http://www.slideshare.net/IgorShkulipa 7
Реализация модели. Файл model.cpp
#include "model.h"
Model::Model() {
usersAndPasswords.insert("User1", "Password1");
usersAndPasswords.insert("User2", "Password2");
usersAndPasswords.insert("User3", "Password3");
usersAndPasswords.insert("User4", "Password4");
usersAndPasswords.insert("User5", "Password5");
}
QList<QString> Model::GetUsers(){
return usersAndPasswords.keys();
}
QString Model::TryToLogin(QString user, QString password){
if (usersAndPasswords.contains(user)) {
int index=usersAndPasswords.keys().indexOf(user);
if (usersAndPasswords.values().at(index) == password)
{
return "Login Successful!";
}
}
return "Login Failed.";
}
http://www.slideshare.net/IgorShkulipa 8
Реализация презентера. Файл presenter.cpp
#include "presenter.h"
Presenter::Presenter()
:view(NULL), model(NULL){
}
Presenter::Presenter(IView *newView)
:view(newView), model(new Model){
QObject *view_obj = dynamic_cast<QObject*>(view);
connect(view_obj, SIGNAL(onLogin()), this, SLOT(Login()));
connect(view_obj, SIGNAL(onListUpdate()), this, SLOT(UpdateUsers()));
}
void Presenter::UpdateUsers(){
view->UpdateUsers(model->GetUsers());
}
void Presenter::Login()
{
QString loginResult =
model->TryToLogin(view->GetUser(), view->GetPassword());
view->ShowMessage(loginResult);
}
http://www.slideshare.net/IgorShkulipa 9
Главное окно. Файл mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow){
ui->setupUi(this);
}
MainWindow::~MainWindow(){
delete ui;
}
QString MainWindow::GetUser(){
return ui->textEdit->toPlainText();
}
QString MainWindow::GetPassword(){
return ui->textEdit_2->toPlainText();
}
http://www.slideshare.net/IgorShkulipa 10
Главное окно. Файл mainwindow.cpp
void MainWindow::UpdateUsers(QList<QString> users){
ui->listWidget->clear();
QStringList stringList(users);
ui->listWidget->addItems(stringList);
}
void MainWindow::ShowMessage(QString message){
QMessageBox *mb=new QMessageBox();
mb->setText(message);
mb->show();
}
void MainWindow::on_pushButton_clicked(){
emit onLogin();
}
void MainWindow::on_listWidget_activated(const QModelIndex &index)
{
emit onListUpdate();
}
http://www.slideshare.net/IgorShkulipa 11
Главный файл. Файл main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "presenter.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow* view=new MainWindow();
Presenter* present=new Presenter(view);
Q_UNUSED(present);
view->show();
return app.exec();
}
http://www.slideshare.net/IgorShkulipa 13
Лабораторная работа №4. Паттерн MVP на Qt
View
Presenter
Model