Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过QtScript使OpenGL代码可访问_C++_Qt_Opengl - Fatal编程技术网

C++ 通过QtScript使OpenGL代码可访问

C++ 通过QtScript使OpenGL代码可访问,c++,qt,opengl,C++,Qt,Opengl,我正在申请教育。。目标是学生可以编写他们想要的任何OpenGL代码,并查看QGLWidget继承类中的结果 为此,我尝试以以下方式使用QtScript: 学生编写的OpenGL代码应该在重新实现的painGL方法中执行 但问题是,从我将从他们的OpenGL代码生成的脚本中,我无法访问OpenGL方法、枚举或任何东西,因为它们既不是Q_可调用的方法,也不是插槽 我该怎么做呢 代码如下: *.h: QString orden_motor是我从QPlainTextEdit收到的代码,它是Grafica

我正在申请教育。。目标是学生可以编写他们想要的任何OpenGL代码,并查看QGLWidget继承类中的结果

为此,我尝试以以下方式使用QtScript: 学生编写的OpenGL代码应该在重新实现的painGL方法中执行

但问题是,从我将从他们的OpenGL代码生成的脚本中,我无法访问OpenGL方法、枚举或任何东西,因为它们既不是Q_可调用的方法,也不是插槽

我该怎么做呢

代码如下:

*.h:

QString orden_motor是我从QPlainTextEdit收到的代码,它是Graficador所在的同一QMainWindow的子项。。当学生按下QPushButton时,将执行dibujar和ejecutar_脚本以及updateGL,它们都是Graficador类的成员。。。 所以脚本应该被执行。。。但是,当我读取QScript值resultado的结果时,我得到的结果是,我没有声明为Q_调用的函数都无法识别。。。这包括所有OpenGL方法,以及OpenGL枚举

如果有人能给我点灯,我会非常感激

对我来说,理想的情况是可以从脚本访问整个QGLWidget类。。。我知道这不是一件理想的事情,但我认为这是最合适的方式

但同样,欢迎任何想法


谢谢

您不能编写包装器类吗?学生可以编写他们想要的任何OpenGL代码。您是否尝试在QScript引擎中执行任意OpenGL代码@Cmannet85是的,那将是理想的情况。。。这不一定需要用QScript引擎完成,我还尝试将代码导出到*.cpp并将其编译成一个全新的应用程序。。。但我试图找到一个更优雅的解决方案,所以我选择了这种方法。。。但就像我说的,我愿意接受建议!我知道对QScript引擎的要求太高了,但目前我只能说…@LaszloPapp我真的不知道包装器类在这里有什么用处。。。你能解释一下吗?谢谢你的回答!
#include <QtOpenGL/QGLWidget>
#include <GL/glu.h>
#include <QColor>

#include <QtScript>


class Graficador : public QGLWidget
{

    Q_OBJECT

public:
    Graficador(QWidget *parent = 0);

    void dibujar(QString);

    void ejecutar_script();

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

private:
    void draw();

    QScriptEngine motor;
    QScriptValue valor;

    QString orden_motor;
};
    Graficador::Graficador(QWidget *parent)
    : QGLWidget(parent)
{
    setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));
}

void Graficador::initializeGL()
{
    qglClearColor(Qt::black);
}

void Graficador::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-w / 2.0, w / 2.0, -h / 2.0, h / 2.0, -1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void Graficador::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    draw();
}

void Graficador::draw()
{
    QScriptValue resultado;
    resultado = motor.evaluate(orden_motor); //Here is where the script should be executed
}


void Graficador::dibujar(QString orden)
{
    orden_motor = orden; //Here I load the script content, which is generated from what the students write
}

void Graficador::ejecutar_script()
{
    valor = motor.newQObject(this);
    motor.globalObject().setProperty("app",valor);
}