当有人用自己的类重载线程时,这个问题似乎已经以一种或另一种形式得到了回答,但是如果只是尝试使用 QTimer 类而不扩展 QThread 类呢?我正在尝试将 QTimer 用于 QT。他们的简单例子
http://qt-project.org/doc/qt-4.7/qtimer.html
他们的例子如下:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
但是当我尝试这样做时,我不断收到错误:
QObject::startTimer:定时器只能用于以 QThread 启动的线程。
我正在通过他的游戏引擎开发系列在 YouTube 上浏览 Jamie King 的一组视频。我计划关注他的视频,所以目前不推荐任何抽象的完全不同的编码技术。这就是我到目前为止所拥有的。
我尝试制作一个小型的快速辅助项目,以使代码尽可能简单。我没有任何构建错误 - 它们仅在程序开始后发生
QTimerApp.cpp
#include <QtWidgets\qapplication.h>
#include <QtWidgets\qwidget.h>
#include "GLWin.h"
int main(int argc, char* argv[])
{
QApplication application(argc, argv);
GLWin MyGL;
MyGL.show();
return application.exec();
}
GLWin.h
#ifndef My_GL_Window
#define My_GL_Window
#include <QtOpenGL\qglwidget>
#include <QtCore\qtimer.h>
class GLWin : public QGLWidget
{
Q_OBJECT // preprocessor from QT - gives what we need for slots
// Declaration* - should be in class. Declared in class, but not defined.
// Needs to be defined in .cpp (manually)
// Or allow QT to define for us. (preferred)
// use moc.exe (found in $(ProjectDir)..\Middleware\Qt\bin\moc.exe against myGLWindow.h
// C:\MyEngine\ProgramFiles\Middleware\Qt\bin\moc.exe myGLWindow.h > MyGLWindow_moc.cpp
// then include MyGLWindow_moc.cpp in project
GLuint vertexBufferID;
QTimer myTimer;
protected:
void initializeGL();
void paintGL();
private slots: //All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration.
// They must also derive (directly or indirectly) from QObject.
private:
void updateWin();
};
#endif
GLWin.cpp
#include <gl\glew.h>
#include "GLWin.h"
#include <cassert>
#include <QTCore\QTimer.h>
void GLWin::initializeGL()
{
GLenum errorCode = glewInit();
assert(errorCode == 0);
glGenBuffers(1, &vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
float verts[] =
{
+0.0f, +0.1f,
-0.1f, -0.1f,
+0.1f, -0.1f,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
QTimer* timer = new QTimer(0);
connect(timer, SIGNAL(timeout()), this, SLOT(updateWin()));
timer->start();
}
void GLWin::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
void GLWin::updateWin()
{
}
我提出的大多数研究都与当他们的类扩展了 QThread 时重载 run() 函数有关。据我所知,我不应该扩展或创建另一个类来发生简单的计时器循环。已经扩展了 QWidget,我的对象已经是 QObject 类型。
任何帮助都非常感谢。谢谢!