Как правильно отделить слой представления от уровня логики в QT?

Мое главное окно имеет боковой графический интерфейс с QGraphicsView в центре, есть логический класс, который выполняет различные вычисления, которые запускаются графическим интерфейсом и влияют на QGraphicsView.
Некоторые из вычислений являются тяжелыми, что заставляет GUI переходить в спящий режим, есть QProgressBar и некоторые другие элементы Qt, которые предоставляют некоторые данные во время выполнения вычислений, поэтому, когда процесс GUI переходит в спящий режим, эти элементы показывают обновленный результат только тогда, когда процесс завершен. Я понимаю, что это потому, что логический класс и пользовательский интерфейс находятся в одном процессе,

Я пытался исправить это, выполнив: Мой старый вопрос а также Блог программирования Майя

Но я пришел к выводу, что обоих недостаточно для моего кода, поскольку у меня есть несколько методов, которые выполняют сложные вычисления, а некоторые возвращают значения. Оба говорят о том, чтобы сделать что-то вроде этого: connect(thread, SIGNAL(started()), worker, SLOT(process()));... чем thread->start();, но в моем коде нет ни одного основного процесса, поэтому, если я хочу работать таким образом, из того, что я понимаю, мне нужно создать поток перед каждым методом процесса, переместить класс логики в этот поток и затем подключить метод процесса с методом запуска потока, который не звучит для меня как правильный способ сделать это.

Поэтому я прошу способ полностью отделить логический уровень от уровня представления, чтобы любой метод, вызвавший уровень логики, работал в другом процессе (который одинаков для всех методов класса логики), поэтому уровень представления не будет идти спать.

Примечание: нет проблем с синхронностью, когда вычисление является единственным, которое работает одновременно.

Пример моей проблемы:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "Logic/worker.h"
namespace Ui {
class MainWindow;
#define MAXLOOP 1000000
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();signals:private slots:

void startProcessing1();

void processing1Done();

void on_pushButton_exit_clicked();

private:
Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

/////////////////////////////////////////////////////////////////////////////////

#include "mainwindow.h"#include "ui_mainwindow.h"#include "QThread"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

ui->progressBar_1->setVisible(false);
ui->progressBar_1->setMaximum(MAXLOOP);
ui->progressBar_1->setMinimum(0);

connect(ui->pushButton_1, SIGNAL(clicked()), this, SLOT(startProcessing1()));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::startProcessing1()
{
ui->progressBar_1->setVisible(true);

Worker *worker = new Worker(MAXLOOP);
QThread* thread = new QThread;
worker->moveToThread(thread);
connect(worker, SIGNAL(finished1Hide()), this, SLOT(processing1Done()));
connect(worker, SIGNAL(changePbar1(int)), ui->progressBar_1, SLOT(setValue(int)));

connect(thread, SIGNAL(started()), worker, SLOT(process1()));

connect(worker, SIGNAL(finished1()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished1()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

thread->start();
}

void MainWindow::processing1Done()
{
ui->progressBar_1->setVisible(false);
}

void MainWindow::on_pushButton_exit_clicked()
{
this->close();
}

/////////////////////////////////////////////////////////////////////////////////

#ifndef WORKER_H
#define WORKER_H

#include <QObject>

class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(int maxLoop, QObject *parent = 0);

signals:

void finished1();
void finished1Hide();
void changePbar1(int val);

public slots:

void process1();

private:

int m_maxLoop;
};

#endif // WORKER_H

/////////////////////////////////////////////////////////////////////////////////

#include "worker.h"
Worker::Worker(int maxLoop, QObject *parent) :
QObject(parent)
{
m_maxLoop = maxLoop;
}

void Worker::process1()
{
int sum = 0;
for(int i = 0; i < m_maxLoop; ++i)
{
emit changePbar1(i);
sum += i;
}
emit finished1();
emit finished1Hide();
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]