通过QtScript使OpenGL代码可访问

时间:2014-04-14 05:41:22

标签: c++ qt opengl

我在Qt中创建了一个用于教育目的的应用程序。目标是学生可以编写他们想要的任何OpenGL代码,并查看QGLWidget继承类中的结果。

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

但问题是,我从他们的OpenGL代码生成的脚本中,我无法访问OpenGL方法,枚举或enything,因为它们既不是Q_INVOKABLE方法也不是插槽......

关于我该怎么做的任何想法?

以下是代码:

* H:

#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;
};

* CPP:

    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);
}

QString&#34; orden_motor&#34;是我从QPlainTextEdit收到的代码,它是与Graficador相同的QMainWindow的孩子。当学生按下QPushButton时,&#34; dibujar&#34;和&#34; ejecutar_script&#34;执行,以及&#34; updateGL&#34;,这些都是Graficador类的成员...... 所以脚本应该被执行......但是当我读到QScriptValue&#34; resultado&#34;的结果时,我得到的是我没有声明的任何功能,因为Q_INVOKED被识别出来......和其中包括所有OpenGL方法,以及OpenGL枚举......

如果有人在这里给我一些启示,我会非常感激!!

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

但同样,欢迎任何想法!

谢谢!

0 个答案:

没有答案