QOpenGLWindow example: use std::unique_ptr instead of QScopedPointer

QScopedPointer is scheduled for deprecation, and can't decide whether
it wants to be a scoped, or a unique pointer.

The use of a unique_ptr members requires that the destructor be
out-of-line, since the payload classes are only forward-declared in
the header file.

Change-Id: Id0dcdde52cb3adc30d3051d2eed1d24c76154921
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Marc Mutz 2019-05-14 20:42:01 +02:00
parent 7303218e42
commit 082f10c9eb
2 changed files with 14 additions and 8 deletions

View File

@ -91,6 +91,9 @@ FragmentToy::FragmentToy(const QString &fragmentSource, QObject *parent)
} }
} }
FragmentToy::~FragmentToy()
= default;
void FragmentToy::draw(const QSize &windowSize) void FragmentToy::draw(const QSize &windowSize)
{ {
if (!m_program) if (!m_program)
@ -120,7 +123,7 @@ void FragmentToy::draw(const QSize &windowSize)
if (!m_vertex_shader->compileSourceCode(vertex_shader)) { if (!m_vertex_shader->compileSourceCode(vertex_shader)) {
qWarning() << "Failed to compile the vertex shader:" << m_vertex_shader->log(); qWarning() << "Failed to compile the vertex shader:" << m_vertex_shader->log();
} }
if (!m_program->addShader(m_vertex_shader.data())) { if (!m_program->addShader(m_vertex_shader.get())) {
qWarning() << "Failed to add vertex shader to program:" << m_program->log(); qWarning() << "Failed to add vertex shader to program:" << m_program->log();
} }
} }
@ -153,7 +156,7 @@ void FragmentToy::draw(const QSize &windowSize)
} }
if (m_fragment_shader) { if (m_fragment_shader) {
if (!m_program->addShader(m_fragment_shader.data())) { if (!m_program->addShader(m_fragment_shader.get())) {
qWarning() << "Failed to add fragment shader to program:" << m_program->log(); qWarning() << "Failed to add fragment shader to program:" << m_program->log();
} }
} }
@ -197,14 +200,14 @@ void FragmentToy::fileChanged(const QString &path)
m_fragment_file_last_modified = fragment_source.lastModified(); m_fragment_file_last_modified = fragment_source.lastModified();
m_recompile_shaders = true; m_recompile_shaders = true;
if (m_program) { if (m_program) {
m_program->removeShader(m_fragment_shader.data()); m_program->removeShader(m_fragment_shader.get());
m_fragment_shader.reset(nullptr); m_fragment_shader.reset(nullptr);
} }
} }
} else { } else {
m_recompile_shaders = true; m_recompile_shaders = true;
if (m_program) { if (m_program) {
m_program->removeShader(m_fragment_shader.data()); m_program->removeShader(m_fragment_shader.get());
m_fragment_shader.reset(nullptr); m_fragment_shader.reset(nullptr);
} }
} }

View File

@ -62,11 +62,14 @@
#include <QOpenGLShaderProgram> #include <QOpenGLShaderProgram>
#include <QOpenGLFunctions> #include <QOpenGLFunctions>
#include <memory>
class FragmentToy : public QObject, protected QOpenGLFunctions class FragmentToy : public QObject, protected QOpenGLFunctions
{ {
Q_OBJECT Q_OBJECT
public: public:
FragmentToy(const QString &fragmentSource, QObject *parent = 0); explicit FragmentToy(const QString &fragmentSource, QObject *parent = nullptr);
~FragmentToy();
void draw(const QSize &windowSize); void draw(const QSize &windowSize);
@ -79,9 +82,9 @@ private:
QString m_fragment_file; QString m_fragment_file;
QDateTime m_fragment_file_last_modified; QDateTime m_fragment_file_last_modified;
QScopedPointer<QOpenGLShaderProgram> m_program; std::unique_ptr<QOpenGLShaderProgram> m_program;
QScopedPointer<QOpenGLShader> m_vertex_shader; std::unique_ptr<QOpenGLShader> m_vertex_shader;
QScopedPointer<QOpenGLShader> m_fragment_shader; std::unique_ptr<QOpenGLShader> m_fragment_shader;
QOpenGLVertexArrayObject m_vao; QOpenGLVertexArrayObject m_vao;
QOpenGLBuffer m_vertex_buffer; QOpenGLBuffer m_vertex_buffer;
GLuint m_vertex_coord_pos; GLuint m_vertex_coord_pos;