τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Ακολουθεί ένα απλό παράδειγμα πλαισίου MVC που βασίζεται σε Qt, στο οποίο οι λειτουργίες στο μοντέλο (Model) επεξεργάζονται σε θυγατρικά νήματα. Αυτό το παράδειγμα θα περιλαμβάνει μια βασική προβολή, ελεγκτή και μοντέλο.
Η δομή του έργου έχει ως εξής:
MyMVCApp/
├── main.cpp
├── model.h
├── model.cpp
├── view.h
├── view.cpp
├── controller.h
├── controller.cpp
├── mainwindow.ui
├── mainwindow.h
├── mainwindow.cpp
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Το τμήμα προβολής είναι κυρίως υπεύθυνο για την εμφάνιση δεδομένων και την αλληλεπίδραση με τον χρήστη.Θα χρησιμοποιήσουμε ένα απλόQMainWindow
Ως προβολή, περιέχει ένα κουμπί και μια ετικέτα.
#ifndef VIEW_H
#define VIEW_H
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
class View : public QWidget
{
Q_OBJECT
public:
explicit View(QWidget *parent = nullptr);
QPushButton *getButton() const;
QLabel *getLabel() const;
private:
QPushButton *button;
QLabel *label;
QVBoxLayout *layout;
};
#endif // VIEW_H
#include "view.h"
View::View(QWidget *parent) : QWidget(parent)
{
button = new QPushButton("Click me", this);
label = new QLabel("Initial text", this);
layout = new QVBoxLayout(this);
layout->addWidget(button);
layout->addWidget(label);
setLayout(layout);
}
QPushButton* View::getButton() const
{
return button;
}
QLabel* View::getLabel() const
{
return label;
}
υπάρχειmainwindow.h
, θα συμπεριλάβουμεview.h
και κάντε το μέρος του κύριου παραθύρου.
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "controller.h"
#include "view.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
Controller *controller;
View *view;
};
#endif // MAINWINDOW_H
υπάρχειmainwindow.cpp
, θα αρχικοποιήσουμε την προβολή και θα συνδέσουμε τα σήματα και τις υποδοχές του ελεγκτή και της προβολής.
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
controller(new Controller(this)),
view(new View(this))
{
ui->setupUi(this);
setCentralWidget(view);
// Connect button click to controller slot
connect(view->getButton(), &QPushButton::clicked, controller, &Controller::handleButtonClicked);
// Connect controller signal to update label
connect(controller, &Controller::updateLabel, view->getLabel(), &QLabel::setText);
}
MainWindow::~MainWindow()
{
delete ui;
}
#ifndef CONTROLLER_H
#define CONTROLLER_H
#include <QObject>
#include "model.h"
class Controller : public QObject
{
Q_OBJECT
public:
explicit Controller(QObject *parent = nullptr);
signals:
void updateLabel(const QString &text);
public slots:
void handleButtonClicked();
private:
Model *model;
};
#endif // CONTROLLER_H
#include "controller.h"
Controller::Controller(QObject *parent) : QObject(parent), model(new Model(this))
{
// Connect model signal to controller signal
connect(model, &Model::dataProcessed, this, &Controller::updateLabel);
}
void Controller::handleButtonClicked()
{
model->processData();
}
#ifndef MODEL_H
#define MODEL_H
#include <QObject>
#include <QThread>
class Model : public QObject
{
Q_OBJECT
public:
explicit Model(QObject *parent = nullptr);
~Model();
void processData();
signals:
void dataProcessed(const QString &result);
private:
QThread workerThread;
};
#endif // MODEL_H
#include "model.h"
#include <QTimer>
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork()
{
// Simulate long-running task
QThread::sleep(2);
emit resultReady("Data processed in background thread");
}
signals:
void resultReady(const QString &result);
};
Model::Model(QObject *parent) : QObject(parent)
{
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Model::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Model::dataProcessed);
workerThread.start();
}
Model::~Model()
{
workerThread.quit();
workerThread.wait();
}
void Model::processData()
{
emit operate();
}
υπάρχειmodel.cpp
Ορίστε ένα σεWorker
Τάξη για την εκτέλεση εργασιών σε παιδικά νήματα.
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork()
{
// Simulate long-running task
QThread::sleep(2);
emit resultReady("Data processed in background thread");
}
signals:
void resultReady(const QString &result);
};
Αυτό το παράδειγμα περιλαμβάνει Προβολή, Ελεγκτή και Μοντέλο.
Η προβολή είναι υπεύθυνη για την εμφάνιση δεδομένων και την αλληλεπίδραση με τον χρήστη, ο ελεγκτής επεξεργάζεται τα δεδομένα χρήστη και ενημερώνει την προβολή και το μοντέλο επεξεργάζεται δεδομένα σε θυγατρικά νήματα και ειδοποιεί τον ελεγκτή να ενημερώσει την προβολή.
Μπορείτε να επεκτείνετε αυτό το πλαίσιο όπως απαιτείται, προσθέτοντας περισσότερη λειτουργικότητα και πολυπλοκότητα.
Ελπίζω αυτό το παράδειγμα να σας βοηθήσει!