【发布时间】:2014-02-17 19:51:28
【问题描述】:
我正在为网格数据创建一种可绘制对象类,但出现此链接器错误。这也是处理在 Qt 教程之一中使用的网格绘制的另一个类的顶部。我还使用 QGLWidget 作为我正在绘制的表面。这是头文件查找第一个类的内容。
#ifndef GLOBJECT_H
#define GLOBJECT_H
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QVector3D>
#include <QVector2D>
#include <QDebug>
#include <QFile>
struct VertexData
{
QVector3D position;
QVector2D texCoord;
QVector3D normal;
};
class GLObject
{
public:
GLObject();
VertexData *data;
GLushort *indices;
GLuint vboIds[2];
int faceCount, vertCount;
bool generateFromPLY(QString filename);
};
#endif // GLOBJECT_H
这是另一个类的标题。
#ifndef GEOMETRYENGINE_H
#define GEOMETRYENGINE_H
#include <QObject>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QVector2D>
#include <QVector3D>
#include <QFile>
#include <QDebug>
#include <QVector>
#include <globject.h>
class GeometryEngine : public QObject, protected QOpenGLFunctions
{
Q_OBJECT
public:
GeometryEngine();
~GeometryEngine();
void init();
void drawGeometry(QOpenGLShaderProgram *program);
//void drawCubeGeometry(QOpenGLShaderProgram *program);
bool generateFromPly(QString filename);
QVector<GLObject> drawables;
int drawableId = 0;
};
#endif // GEOMETRYENGINE_H
G:\Dropbox\GLSLDemo\globject.cpp:60: 错误: 'glGenBuffers' 未在此范围内声明 glGenBuffers(2, vboIds); 以及其他 gl 调用的相同错误。 最初,我拥有 GeometryEngine 中的所有代码。那时我没有范围问题。如果相关,则在 GeometryEngine 的 init() 中调用 initilizeOpenGLFunctions()。 ^
【问题讨论】:
-
这就是 QOpenGLFunctions 的用途。它将 GL/ES 2.0 上下文引入到从我理解的继承它的任何窗口/小部件中。我确实让所有这些代码都能正常工作,但我正在重新组织它,所以它不会那么混乱。我可以提取我的其他工作代码,因为我在破坏太多东西之前备份了它。我只是很难过为什么它现在才给我这个范围错误。不过感谢标题反馈。我还在学习如何组织我的 C 项目。
-
不确定 globject.cpp:60 包含什么,但只有 GeometryEngine 继承自 QOpenGLFunctions(受保护),但 globject.h 中没有。所以我假设 globject.cpp:60 中的任何内容,它都不在从 QOpenGLFunctions 继承的类的范围内
-
哦,既然GeometryEngine继承了protected,没有其他类可以访问这些函数?我想这是有道理的。我认为 globject.cpp:60 是 glBindBuffer() 。我实际上已经继续前进并或多或少地改变了一些事情。
-
是的,为了使它们公开可用,您必须公开继承。
-
另外,似乎 QOpenGLFunctions 实际上必须被继承并用作成员函数。好吧,我想我已经解决了这个问题。谢谢。