-2

我在 qt4 IDE 中的 opengl 上创建了一个 gui。我创建了一个带有 opengl 窗口的小部件,在那里我能够显示 [b] 曲线 [/b]。在这里我使用 [b]paintGL()[/b] 并在其中调用我的绘图函数进行显示。但我的问题是,我在这里使用 [b] mousePressEvent(QMouseEvent *event)[/b] 来获取像素坐标,以便单击 opengl 窗口我可以在该特定单击位置生成曲线。但是运行程序后我发现初始绘制函数和生成的曲线。但点击窗口后无法更新,但在控制台应用程序中执行了所有计算,只有显示没有更新。

那么在这个窗口上点击鼠标后如何更新opengl窗口呢?

这是我的源代码:

GlWidget.cpp

//////Mouse Click Event for finding the pixel values//////
void GLWidget::mousePressEvent(QMouseEvent *event)
{

  float window_width,window_height;
  float ratio_x,ratio_y,cy;  
  click_x=event->x();
  click_y=event->y();
  //  qDebug()<<"screen cx1==="<<cx1;
  // qDebug()<<"screen cy1==="<<cy1;

  window_width = 800;
  window_height = 600;

  ratio_x=30.0/window_width;
  ratio_y=30.0/window_height;
  cy=window_height-click_y;
  click_x=click_x*ratio_x-10;
  click_y=cy*ratio_y-10;

  qDebug()<<"original_position_on_screen x==="<<click_x;
  qDebug()<<"original_position_on_screen y==="<<click_y;

  count=count+1;
  qDebug()<<"count==="<<count;
  func();                                             
}

void GLWidget::func()
{
    Draw_Curve();       //Drawing function
}

void GLWidget::Draw_Curve()
{
//Draw The Curve
}



void GLWidget:: paintGL()  // paintGL() function
{
  glClear(GL_COLOR_BUFFER_BIT);
  Draw_Axes();  //Draw 3d coordinate axes           

  func();       //in this function we get the pixel coordinates everytime the    mouse is clicked   in the window
 }
4

1 回答 1

0

有几件事:

  • 而不是调用函数从鼠标事件处理程序呈现任何内容,您应该请求更新

    void GLWidget::mousePressEvent(QMouseEvent *event)
    {
      float window_width,window_height;
      float ratio_x,ratio_y,cy;  
      click_x=event->x();
      click_y=event->y();
      //  qDebug()<<"screen cx1==="<<cx1;
      // qDebug()<<"screen cy1==="<<cy1;
    
      window_width = 800;
      window_height = 600;
    
      ratio_x=30.0/window_width;
      ratio_y=30.0/window_height;
      cy=window_height-click_y;
      click_x=click_x*ratio_x-10;
      click_y=cy*ratio_y-10;
    
      qDebug()<<"original_position_on_screen x==="<<click_x;
      qDebug()<<"original_position_on_screen y==="<<click_y;
    
      count=count+1;
      qDebug()<<"count==="<<count;
    
      update();  // to request image update
    }
    
  • 您的 paintGL() 方法会完成所有渲染。所以,无论你想显示什么都在这里。

于 2012-07-13T10:37:50.750 回答