[Interest] Usage of QAbstractOpenGLFunctions and derived classes
yves.bailly at sescoi.fr
Tue Dec 17 09:49:48 CET 2013
Using the just released Qt 5.2.0 with QtCreator 3.0, compiler Visual C++ 2012 64bits on Windows 7 64bits.
I'm trying to use the QtGui/QOpenGLFunctions_3_3_Core class to get access to
OpenGL 3.3 Core functions (desktop obviously), by subclassing QGLWidget like
class Gl_Widget: public QGLWidget, protected QOpenGLFunctions_3_3_Core
virtual void initializeGL() override;
The first lines of "initializeGL()" are:
if ( not this->isInitialized() )
A few questions now.
When I try to build this program, I get a link error:
gl_widget.obj : error LNK2019: symbole externe non résolu "protected: bool __cdecl
(?isInitialized at QAbstractOpenGLFunctions@@IEBA_NXZ) référencé dans la fonction "protected: virtual
void __cdecl Gl_Widget::initializeGL(void)" (?initializeGL at Gl_Widget@@MEAAXXZ)
...which basically says the external symbol QAbstractOpenGLFunctions::isInitialized() could not be
If I remove the "if" line, thus not calling isInitialized(), everything works fine. I even tried to force
name resolution with "if (not this->QOpenGLFunctions_3_3_Core::isInitialized())", but no luck.
Any idea about what can go wrong?
For what I see, the QOpenGLFunctions_* classes are storing a bunch of function pointers, which are
dynamically resolved at runtime. If I want to use those functions, I can either:
- ask a pointer from the context by QOpenGLContext::versionFunctions(), which makes then a code looking
...where the "gl_funcs->" prefix is quite cumbersome, to say the least.
- or subclass from QOpenGLFunctions_* when needed for a more direct access to the function. But in
this case, what if I need access to OpenGL functions in hundreds or thousands of instances?
resolving and storing function pointers in each of them would be overkill.
To alleviate those points, I tried something like this (with various variations and more sanity checks):
class My_Class: public Some_Other_Super, protected QOpenGLFunctions_3_3_Core
QOpenGLContext* ctx = QOpenGLContext::currentContext();
QOpenGLFunctions_3_3_Core* funcs = ctx->versionFunctions<QOpenGLFunctions_3_3_Core>();
dynamic_cast<QOpenGLFunctions_3_3_Core&>(*this) = *funcs;
...in the hope to be able to reuse already resolved function pointers, hoping QOpenGLFunctions_*
classes are using implicit sharing or something like that... but of course it doesn't work, I
get crashes when destroying instances, double-deletes, and so on.
I tried to fallback to Glew, but for whatever reason it refuses to resolve e.g. glCopyBufferSubData(),
whereas it's resolved fine by QOpenGLFunctions_3_3_Core...
I searched the doc, but couldn't find any hint on the "right way" to easily use those QOpenGLFunctions_*
classes in non-trivial cases. Has others had more ideas?
Thanks in advance.
/- Yves Bailly - Software developer -\
\- Sescoi R&D - http://www.sescoi.fr -/
"The possible is done. The impossible is being done. For miracles,
thanks to allow a little delay."
More information about the Interest