我在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类可以从脚本中访问...我知道这不是理想的事情,但我认为它是最合适的方式这样做......
但同样,欢迎任何想法!
谢谢!