QT 游戏引擎编辑器制作注意事项

"游戏引擎"

Posted by A-SHIN on June 14, 2018

“Yeah It’s on. ”

前言

QT编写引擎编辑器中遇到的问题,逐一记录

正文

由于引擎底层使用了glew、freeglut库。编辑器引用引擎库后,使用freeglut库函数会报错, 改用官方glut后函数能正常使用。但是官方glut库引擎不支持鼠标滚轮事件。因此又换回了freeglut库,编辑器中不使用该库的函数即可。编辑器初始化时需调用glewInit();
QT的paintGL函数不会每帧刷新,需要开个定时器调用update刷新函数:

connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
timer.start(16);

使用fbo之前需要保存系统帧缓存对象(QT里不是0)

GLint originalFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO);

mShadowMap->PreRender();	//glBindFramebuffer(GL_FRAMEBUFFER, depth_fbo);
RenderScene(true);
mShadowMap->PostRender();	//glBindFramebuffer(GL_FRAMEBUFFER, originalFBO);
RenderScene(false);

编辑器模式下帧缓存gDEBugger截图如下: 游戏模式下帧缓存gDEBugger截图如下:
QT Widget中的OpenGL相关处理(如:模型加载后的VBO生成等)必须在继承QOpenGLWidget的函数里处理

QOpenGLWidget默认只响应鼠标时间,无法响应键盘事件(焦点不在该Widget上)。需要在鼠标左键响应函数里添加setFocus();才能响应到键盘事件。

使用QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onPushButton())); 的connect重载版本onPushButton函数前需要public Q_SLOTS:
使用QObject::connect(ui.pushButton, &QPushButton::clicked, this, &hxtest::onPushButton); 则不需要public Q_SLOTS:

如果信号槽函数有重载,使用QT4形式connect时,槽函数参数必须和信号函数参数完全一致。
connect(spinboxPositionX, SIGNAL(valueChanged(double)), this, SLOT(PositionXValueChanged(double value)));
connect(spinboxPositionX, SIGNAL(valueChanged(double)), this, SLOT(PositionXValueChanged(double)));
函数申明和定义可使用(double value)参数形式。函数申明前要加 public Q_SLOTS: 宏

后记