Skip to content
Snippets Groups Projects

Test

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Ashley Walton
    mainwindow.cpp 1.83 KiB
    #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));
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment