-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmainwindow.cpp
More file actions
96 lines (83 loc) · 3.29 KB
/
mainwindow.cpp
File metadata and controls
96 lines (83 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "plot3d.h"
#include "solvecontroller.h"
#include "cljacobiiterator.h"
#include <QtDataVisualization/Q3DSurface>
#include <QtGui/QScreen>
#include <QThread>
#include <QTextEdit>
#include <QDockWidget>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
using namespace QtDataVisualization;
ui->setupUi(this);
Q3DSurface* plotSurface = new Q3DSurface();
QWidget *container = QWidget::createWindowContainer(plotSurface);
QSize screenSize = plotSurface->screen()->size();
container->setMaximumSize(screenSize);
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
container->setFocusPolicy(Qt::StrongFocus);
ui->centralWidget->layout()->addWidget(container);
m_plot = new Plot3D(plotSurface);
ui->m_iteratorComboBox->insertItem(0, "Метод Якоби");
ui->m_iteratorComboBox->insertItem(1, "Метод Гаусса-Зейделя");
ui->m_iteratorComboBox->insertItem(2, "Многосеточный метод");
ui->m_iteratorComboBox->insertItem(3, "Метод Якоби OpenCL");
ui->m_iteratorComboBox->setCurrentIndex(3);
m_log = new QTextEdit(this);
m_log->setReadOnly(true);
QDockWidget *dockWidget = new QDockWidget(tr("Лог"), this);
dockWidget->setWidget(m_log);
dockWidget->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onSolve()
{
std::unique_ptr<AbstractIterator> iterator;
switch(ui->m_iteratorComboBox->currentIndex())
{
case 0:
iterator.reset(new JacobiIterator());
onMessage("\nРешение методом Якоби:\n");
break;
case 1:
iterator.reset(new ZeidelIterator());
onMessage("\nРешение методом Гаусса-Зейделя:\n");
break;
case 2:
iterator.reset(new MultigridIterator(2));
onMessage("\nРешение многосеточным методом:\n");
break;
case 3:
iterator.reset(new ClJacobiIterator());
onMessage("\nРешение методом Якоби OpenCL:\n");
break;
default:
return;
}
SolveController* controller = new SolveController(ui->m_gridSizeSpinBox->value(),
ui->m_epsilonSpinBox->value(),
std::move(iterator),
ui->m_iterationsSpinBox->value());
QThread* thread = new QThread();
controller->moveToThread(thread);
connect(controller, &SolveController::solution, m_plot, &Plot3D::setData);
connect(controller, &SolveController::message, this, &MainWindow::onMessage);
connect(thread, SIGNAL(started()), controller, SLOT(solve()));
connect(controller, SIGNAL(finished()), thread, SLOT(quit()));
connect(controller, SIGNAL(finished()), controller, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
void MainWindow::onMessage(const QString &message)
{
m_log->insertPlainText(message);
m_log->ensureCursorVisible();
}