gpt4 book ai didi

c++ - QTimer 与扩展 QThread 无关

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:02 26 4
gpt4 key购买 nike

当有人用他们自己的类重载线程时,这个问题似乎已经以一种或另一种形式得到了回答,但是如果只是尝试使用 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 启动的线程。

我正在研究 Jamie King 在 YouTube 上的游戏引擎开发系列视频集。我计划关注他的视频,因此目前不推荐任何抽象的完全不同的编码技术。这是我到目前为止所拥有的。

我试着做一个小型的快速副项目来尽可能地保持代码简单。我没有任何构建错误 - 它们仅在程序开始运行后发生

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 类型。

非常感谢任何帮助。谢谢!

最佳答案

您的代码有很多问题:

  • QtFoo\ 样式包含。您最好使用正斜杠,因为这是永久使用它的常用方法。

  • 您实际上不需要显式使用 QtFoo,它也更好,因为它使构建系统更可靠,项目更可移植。

  • 您不对结束类使用Q_DECL_FINAL 优化。

  • 您不对重写的成员方法使用 Q_DECL_OVERRIDE

  • 您实际上并未将插槽标记为插槽。

  • 您没有为计时器设置父项,因此它会泄漏内存。

  • 当 Qt 有自己的 Q_ASSERTQ_ASSERT_X 时,您可以使用 cassert

  • 您使用 qfoo.h 样式包含,而 QFoo 是常见的使用模式。

  • 您不使用新的信号槽语法。

这是我的工作版本:

main.cpp

#include <glew.h>

#include <QApplication>
#include <QGLWidget>
#include <QTimer>

class GLWin Q_DECL_FINAL : public QGLWidget
{
Q_OBJECT
GLuint vertexBufferID;
QTimer myTimer;

protected:
void initializeGL() Q_DECL_OVERRIDE
{
GLenum errorCode = glewInit();
Q_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(this);
connect(timer, &QTimer::timeout, this, &GLWin::updateWin);
timer->start();
}

void paintGL() Q_DECL_OVERRIDE
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
private slots:
void updateWin() {}
};

#include "main.moc"

int main(int argc, char **argv)
{
QApplication application(argc, argv);
GLWin MyGL;
MyGL.show();
return application.exec();
}

主程序

TEMPLATE = app
TARGET = main
QT += widgets opengl
SOURCES += main.cpp
packagesExist(glew) {
CONFIG += link_pkgconfig
PKGCONFIG += glew
}

构建并运行

qmake && make && ./main

关于c++ - QTimer 与扩展 QThread 无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27684316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com