13
Темы лекции: Паттерн MVP на Qt. Практическое задание: Паттерн MVP на Qt. Тренер: Игорь Шкулипа, к.т.н. С++ Библиотеки STL и Qt. Занятие 4

C++ STL & Qt. Занятие 04

Embed Size (px)

Citation preview

Page 1: C++ STL & Qt. Занятие 04

Темы лекции: Паттерн MVP на Qt.

Практическое задание: Паттерн MVP на Qt.

Тренер: Игорь Шкулипа, к.т.н.

С++ Библиотеки STL и Qt. Занятие 4

Page 2: C++ STL & Qt. Занятие 04

http://www.slideshare.net/IgorShkulipa 2

Проект «Окно логина»

Page 3: C++ STL & Qt. Занятие 04

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

Page 4: C++ STL & Qt. Занятие 04

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

Page 5: C++ STL & Qt. Занятие 04

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

Page 6: C++ STL & Qt. Занятие 04

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

Page 7: C++ STL & Qt. Занятие 04

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.";

}

Page 8: C++ STL & Qt. Занятие 04

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

}

Page 9: C++ STL & Qt. Занятие 04

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

}

Page 10: C++ STL & Qt. Занятие 04

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

}

Page 11: C++ STL & Qt. Занятие 04

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

}

Page 12: C++ STL & Qt. Занятие 04

http://www.slideshare.net/IgorShkulipa 12

Результат

Page 13: C++ STL & Qt. Занятие 04

http://www.slideshare.net/IgorShkulipa 13

Лабораторная работа №4. Паттерн MVP на Qt

View

Presenter

Model