Qt QOpenGLFunctions 未在此范围内声明

Posted

技术标签:

【中文标题】Qt QOpenGLFunctions 未在此范围内声明【英文标题】:Qt QOpenGLFunctions not declared in this scope 【发布时间】: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 实际上必须被继承并用作成员函数。好吧,我想我已经解决了这个问题。谢谢。 【参考方案1】:

QT OpenGL 很奇怪。我认为 QOpenGLFunctions 维护了一个共同的上下文。我也不擅长 C++ 并且使用了受保护的错误。

【讨论】:

以上是关于Qt QOpenGLFunctions 未在此范围内声明的主要内容,如果未能解决你的问题,请参考以下文章

qrand 未在此范围内声明

错误:未在此范围内声明“对象”

未在此范围内声明 CvSVM 错误

C++ Win API 函数'未在此范围内声明'

C++ 错误:未在此范围内声明类/对象

数据“未在此范围内声明的成员”