Test
The snippet can be accessed without any authentication.
Authored by
Ashley Walton
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "raycaster.h"
#include <QThread>
class GenerateThread : public QThread {
public:
GenerateThread(QSize viewportSize, qreal dpi)
: m_viewportSize(std::move(viewportSize)), m_dpi(dpi) {
qDebug() << QThread::currentThreadId();
}
void run() override {
qDebug() << QThread::currentThreadId();
RayCaster caster;
m_result = caster.generate(QRectF(-0.5, -0.5, 1, 1), m_viewportSize, m_dpi);
}
QImage *result() { return &m_result; }
private:
QSize m_viewportSize;
qreal m_dpi;
QImage m_result;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
}
MainWindow::~MainWindow() { delete ui; }
bool MainWindow::event(QEvent *event) {
switch (event->type()) {
case QEvent::Type::Resize: {
ui->viewport->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
qDebug() << "Resize to " << this->geometry().size();
ui->viewport->resize(this->geometry().size());
generateImage();
break;
}
default:
break;
}
return QMainWindow::event(event);
}
void MainWindow::generateImage() {
auto *thread = new GenerateThread(ui->viewport->size(), devicePixelRatio());
thread->start();
// [5] Let the window know that the thread has finished
QObject::connect(thread, &QThread::finished, this,
&MainWindow::threadFinished);
}
void MainWindow::threadFinished() {
// [9] Receive the sender
auto *generateThread = static_cast<GenerateThread *>(sender());
if (generateThread->result()->size() !=
ui->viewport->size() * devicePixelRatio())
return;
// [10] Instead of below:
ui->viewport->setPixmap(QPixmap::fromImage(*generateThread->result()));
// [6] Finally we set the image to the result
ui->viewport->setPixmap(QPixmap::fromImage(*m_image));
}
Please register or sign in to comment