Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface Qt中的GLWidget仅在mousemove上更新_User Interface_Qt_Opengl_Animation - Fatal编程技术网

User interface Qt中的GLWidget仅在mousemove上更新

User interface Qt中的GLWidget仅在mousemove上更新,user-interface,qt,opengl,animation,User Interface,Qt,Opengl,Animation,我目前正在玩Qt,试图建立一个小粒子系统。在这里,我对GLWidget进行了子类化并对其进行了黑客攻击。一切都进行得很顺利,直到我做了一些未知的更改,现在小部件只在我移动鼠标时重新绘制(由于我触发了QTimer,它应该一直在这样做)。相关代码: OpenGLWidget.h class OpenGLWidget : public QGLWidget { Q_OBJECT public: OpenGLWidget(QWidget * parent = 0); ~OpenG

我目前正在玩Qt,试图建立一个小粒子系统。在这里,我对GLWidget进行了子类化并对其进行了黑客攻击。一切都进行得很顺利,直到我做了一些未知的更改,现在小部件只在我移动鼠标时重新绘制(由于我触发了QTimer,它应该一直在这样做)。相关代码:

OpenGLWidget.h

class OpenGLWidget :  public QGLWidget  {

   Q_OBJECT

public:
   OpenGLWidget(QWidget * parent = 0);
   ~OpenGLWidget();

public slots:
   void toggleEmitter();

protected:
   void initializeGL();
   void paintGL();
   void resizeGL(int width, int height);
   QSize minimumSizeHint() const;
   QSize sizeHint() const;
   void mousePressEvent(QMouseEvent *event);
   void mouseMoveEvent(QMouseEvent *event);

protected slots:
   void timeOut();

private:

   void testFunc(Particle & p, unsigned int t);

   QTime time;
   QTimer timer;

   Emitter emitter;
来自.cpp的相关代码

// in the constructor
time.start();
connect(&timer, SIGNAL(timeout()), this, SLOT(timeOut()));
timer.start(0);

void OpenGLWidget::initializeGL()  {
   GLuint tex = 0;

   qglClearColor(bgColor);
   glEnable(GL_DEPTH_TEST);   
   glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
   glShadeModel(GL_SMOOTH); 

   glDisable(GL_CULL_FACE);
   glEnable(GL_TEXTURE_2D); 
   glEnable( GL_BLEND );
   glBlendFunc( GL_SRC_ALPHA, GL_ONE); // _MINUS_SRC_ALPHA );

   glPointSize(3.0f);

   tex = bindTexture(QPixmap(QString("testparticle2.png")), GL_TEXTURE_2D);
   emitter = Emitter(Vector(0, 0, 0.0f), tex, 50, fastdelegate::FastDelegate2<Particle &, unsigned int>(this, &OpenGLWidget::testFunc));
}

void OpenGLWidget::paintGL()  {
   makeCurrent();
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   mainCam.SetView();

   glRotatef(xRot, 1, 0, 0);
   glRotatef(yRot, 0, 1, 0);

   emitter.Process(time.elapsed());

   totalTime += time.elapsed();
   time.restart();

}

void OpenGLWidget::resizeGL(int width, int height)  {
   contextWidth = width;
   contextHeight = height;

   glViewport(0, 0, width, height);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(55.0f, width / (float) height, 0.01f, 100.0f);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

}

void OpenGLWidget::timeOut()  {
   updateGL();
}

void OpenGLWidget::mousePressEvent(QMouseEvent *event)  {
    lastX = event->pos().x();
    lastY = event->pos().y();
}

void OpenGLWidget::mouseMoveEvent(QMouseEvent *event)  {
    int dx = event->x() - lastX;
    int dy = event->y() - lastY;

    if (event->buttons() & Qt::LeftButton) {
        xRot += 3 * dy;
        yRot += 3 * dx;
    } else if (event->buttons() & Qt::RightButton) {
        xRot += 3 * dy;
        yRot += 3 * dx;
    }

    lastX = event->pos().x();
    lastY = event->pos().y();

}
//在构造函数中
time.start();
连接(&计时器,信号(超时()),此,插槽(超时());
定时器启动(0);
void OpenGLWidget::initializeGL(){
GLuint-tex=0;
qglClearColor(bgColor);
glEnable(GLU深度试验);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glShadeModel(GL_平滑);
glDisable(GLU消隐面);
glEnable(GL_纹理_2D);
glEnable(GL_混合物);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);///减去GL SRC_ALPHA);
glPointSize(3.0f);
tex=bindTexture(QPixmap(QString(“testparticle2.png”)),GL_TEXTURE_2D);
发射器=发射器(向量(0,0,0.0f),tex,50,fastdelegate::FastDelegate2(this,&OpenGLWidget::testFunc));
}
void OpenGLWidget::paintGL(){
makeCurrent();
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
mainCam.SetView();
glRotatef(xRot,1,0,0);
glRotatef(yRot,0,1,0);
emitter.Process(time.appeased());
totalTime+=时间。已用();
time.restart();
}
void OpenGLWidget::resizeGL(整数宽度、整数高度){
上下文宽度=宽度;
上下文高度=高度;
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
透视图(55.0f,宽度/(浮动)高度,0.01f,100.0f);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void OpenGLWidget::timeOut(){
updateGL();
}
void OpenGLWidget::MousePresseEvent(QMouseEvent*事件){
lastX=事件->位置().x();
lastY=事件->位置().y();
}
void OpenGLWidget::mouseMoveEvent(QMouseEvent*event){
int dx=event->x()-lastX;
int dy=event->y()-lastY;
if(事件->按钮()&Qt::LeftButton){
xRot+=3*dy;
yRot+=3*dx;
}else if(事件->按钮()&Qt::RightButton){
xRot+=3*dy;
yRot+=3*dx;
}
lastX=事件->位置().x();
lastY=事件->位置().y();
}
考虑到updateGL()调用了调用paintGL()的glDraw(),您可能认为计时器应该调用与mousemove事件相同的功能

你确定计时器真的在滴答作响吗

顺便说一句,在中不需要调用makeCurrent()

编辑:添加额外信息后:

:

“作为一种特殊情况,具有 超时0在所有 窗口系统事件中的事件 队列已被处理。”

因此,如果您希望它运行得尽可能快(尽管在Windows和大多数基于x386的系统上,10ms可能是最小值),那么请使用值1而不是0启动计时器。我假设这就是问题所在,它只有在从队列中读取完消息后才会滴答作响。

考虑到updateGL()调用了glDraw(),而glDraw()调用了paintGL(),您可能认为计时器应该调用与mousemove事件相同的功能

你确定计时器真的在滴答作响吗

顺便说一句,在中不需要调用makeCurrent()

编辑:添加额外信息后:

:

“作为一种特殊情况,具有 超时0在所有 窗口系统事件中的事件 队列已被处理。”


因此,如果您希望它运行得尽可能快(尽管在Windows和大多数基于x386的系统上,10ms可能是最小值),那么请使用值1而不是0启动计时器。我假设这就是问题所在,它只有在从队列中读取完消息后才会发出滴答声。

只有在事件循环获得控件时才会触发超时时间为0秒的QTimer。我怀疑情况并非如此。但是,当您移动鼠标时,事件循环(再次)处理一些事件,然后传递挂起的计时器事件。可能需要在更新循环中调用,以确保处理来自QTimer的挂起计时器事件。

只有当事件循环获得控件时,才会触发超时为0秒的QTimer。我怀疑情况并非如此。但是,当您移动鼠标时,事件循环(再次)处理一些事件,然后传递挂起的计时器事件。也许您需要在更新循环中调用,以确保处理来自QTimer的挂起计时器事件。

计时器在小于20ms的时间内无法工作。它等于0。您可以使用简单的循环来测量从一个迭代到另一个迭代的时间。测量方法可能应该使用您的操作系统的API。

计时器不能在小于20ms的时间内工作。它等于0。您可以使用简单的循环来测量从一个迭代到另一个迭代的时间。测量方法可能应该使用操作系统的API。

makeCurrent用于调试目的。结果显示计时器正在滴答作响,但时间步长没有正确更新,除非鼠标正在移动。是否尝试非零时间步长?1/60秒约为17毫秒。makeCurrent用于调试。结果显示计时器正在滴答作响,但时间步长没有正确更新,除非鼠标正在移动。是否尝试非零时间步长?1/60秒约为17毫秒。