プライベートな連絡先の最初の情報
送料メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
以下は、モデル (Model) 内の操作が子スレッドで処理される、Qt ベースの単純な MVC フレームワークの例です。この例には、基本的なビュー、コントローラー、モデルが含まれます。
プロジェクトの構造は次のとおりです。
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
で 1 つを定義します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);
};
この例には、ビュー、コントローラー、モデルが含まれています。
ビューはデータの表示とユーザーの対話を担当し、コントローラーはユーザー入力を処理してビューを更新し、モデルは子スレッド内のデータを処理してコントローラーにビューを更新するように通知します。
必要に応じてこのフレームワークを拡張して、機能と複雑さを追加できます。
この例がお役に立てば幸いです。