#include "openglwindow.h" #include #include #include #include OpenGLWindow::OpenGLWindow(QWindow *parent) : QWindow(parent) , m_context(nullptr) , m_device(nullptr) { setFlags(flags() | Qt::FramelessWindowHint); setSurfaceType(QWindow::OpenGLSurface); QSurfaceFormat format = QSurfaceFormat::defaultFormat(); // qDebug() << format; #ifdef QT_OPENGL_ES_2 format.setRenderableType(QSurfaceFormat::OpenGLES); #else if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) { format.setVersion(4, 0); format.setProfile(QSurfaceFormat::CoreProfile); } #endif format.setDepthBufferSize(24); format.setSamples(8); // format.setStencilBufferSize(8); setFormat(format); QSurfaceFormat::setDefaultFormat(format); } OpenGLWindow::~OpenGLWindow() { delete m_device; } void OpenGLWindow::render(QPainter *painter) { } void OpenGLWindow::initialize() { } void OpenGLWindow::render() { // if (!m_device) m_device = new QOpenGLPaintDevice; // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // m_device->setSize(size() * devicePixelRatio()); // m_device->setDevicePixelRatio(devicePixelRatio()); // QPainter painter(m_device); // render(&painter); } void OpenGLWindow::renderLater() { requestUpdate(); } bool OpenGLWindow::event(QEvent *event) { switch (event->type()) { case QEvent::UpdateRequest: renderNow(); return true; default: return QWindow::event(event); } } void OpenGLWindow::exposeEvent(QExposeEvent *event) { if (isExposed()) renderNow(); } void OpenGLWindow::renderNow() { if (!isExposed()) return; bool needsInitialize = false; if (!m_context) { m_context = new QOpenGLContext(this); m_context->setFormat(requestedFormat()); m_context->create(); needsInitialize = true; } m_context->makeCurrent(this); if (needsInitialize) { initializeOpenGLFunctions(); initialize(); } render(); m_context->swapBuffers(this); }