OpenGL - QT:鼠标移动事件效果未显示

Posted

技术标签:

【中文标题】OpenGL - QT:鼠标移动事件效果未显示【英文标题】:OpenGL - QT: Mouse move event effects is not showing up 【发布时间】:2012-12-05 00:59:08 【问题描述】:

我正在使用 opengl-tutorial.org 学习,我也在使用 QT,当我移动鼠标时,MVP 矩阵会更新,效果很好。但在我按下 Alt 键之前,屏幕不会显示更改。不知道为什么,是QT还是OpenGL的问题?

InitGL 函数:

programId = this->createPorgram(":/glsl/VertexShader.glsl",":/glsl/FragmentShader.glsl");
if(programId==-1)
    emit blewUpApplication();
    return;


glClearColor(0.0,0.0,0.0,1.0);
glEnable(GL_CULL_FACE);
glEnable(GL_MULTISAMPLE); // Enables multisampling for a better look
//glEnable(GL_BLEND); // Enable textures with alpha channel and alpha channels colors
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
// Bla bla bla, the rest does not matters.

PaintGL 功能:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clears the screen and paint the bg with the color specified on glClearColor

float currT = float(tmr.elapsed() / 1000.0f);
if((currT-lastTime)>=1.0f)
    lastTime+=1.0f;

deltaTime = (float)(currT-lastTime);

glm::mat4 Project = this->getMatrixProjection();
glm::mat4 View = this->getMatrixView();
glm::mat4 Model = glm::mat4(1.0f);
glm::mat4 MVP = Project * View * Model;

glUseProgram(programId);

GLuint MatrixId = glGetUniformLocation(programId,"MVP");
glUniformMatrix4fv(MatrixId,1,GL_FALSE,glm::value_ptr(MVP));

glActiveTexture(cursor_texture);
glBindTexture(GL_TEXTURE_2D,cursor_texture);

glUniform1i(glGetUniformLocation(programId,"textura"),cursor_texture);
// Draw or triangles

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);   

glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[0]);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);


glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[1]);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,(void*)0);


glDrawArrays(GL_TRIANGLES,0,12*3);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glUseProgram(0);

鼠标移动功能:

mousepos[0] = evt->x();
    mousepos[1] = evt->y();
    horzAn += mouseSpeed * deltaTime * float(this->width()/2 - mousepos[0]);
    vertAn += mouseSpeed * deltaTime * float(this->height()/2 - mousepos[1]);

    CmDirect = glm::vec3(cos(horzAn) * sin(vertAn), sin(vertAn), cos(horzAn) * cos(vertAn));
    glm::vec3 RgtVc = glm::vec3(sin(horzAn - 3.14f/2.0f),0,cos(horzAn - 3.14f/2.0f));
    UpVc = glm::cross(RgtVc,CmDirect);

    Proj = glm::perspective(Zoom,4.0f/3.0f,0.1f,100.0f);
    Vw = glm::lookAt(PosCm,PosCm+CmDirect,UpVc);
    this->cursor().setPos(suppose_x,suppose_y);

着色器:

// Fragment
#version 330 core
out vec3 color;
in vec2 thcoord;
in vec2 UV;
uniform sampler2D d_textura;
void main()
color = texture(d_textura,thcoord).rgb;

// Vertex
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 tcoord;
out vec2 thcoord;
uniform mat4 MVP;
void main()
vec4 v = vec4(vertexPosition_modelspace,1);
thcoord=tcoord;
gl_Position = MVP * v;

我知道矩阵运算效果很好,因为当我按下 alt 键时效果会发生变化(只发生一次)。

【问题讨论】:

是否有处理 alt 按键的代码?还是只是随机的 alt 键? 我不知道,我只是运行应用程序,我没有在应用程序的任何部分编写 alt 键事件。 alt 键无所谓,更重要的是为什么不采取更新后的 MVP Matrix 的效果。 OT:这是 Qt(一个 C++ 框架),而不是 QT(QuickTime)。 【参考方案1】:

您应该将更新请求添加到 mouseMoveEvent 处理程序的末尾,以便 Qt 知道该小部件需要重新绘制。 update() 或 repaint() 应该可以解决问题。

【讨论】:

以上是关于OpenGL - QT:鼠标移动事件效果未显示的主要内容,如果未能解决你的问题,请参考以下文章

qt鼠标悬停在按钮变大

Qt4:未捕获 QTableView 鼠标按钮事件

用C++或者OpenGL或者Ogre实现鼠标移动轨迹

QT5 如何用两个事件作画?

Qt自定义界面边框后,移动鼠标拖动界面,界面会拖到任务栏以下。。。如何解决?

qt QListWidget 添加鼠标移动事件(mouseMoveEvent),让父窗体可以监听到鼠标移动