2012-03-19 2 views
1

誰かがQtの(QGL)ウィジェットの中心にマウスの位置を保つためにトリックを持っているのだろうかと思います。私はデルタを見つけた後にマウスを置くことができると読んでいますが、この方法は私のために非常にバギーです。マウスイベントは正しく登録されていません。もしそうであれば、非常に不安定です。マウスを中心にしたQt

void World::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) { 

     GLfloat dx = GLfloat(event->x() - lastPos.x())/width(); 
     GLfloat dy = GLfloat(event->y() - lastPos.y())/height(); 

     player->rotHorizontal += 360.0 * dx; 
     if(player->rotHorizontal < 0.0) 
      player->rotHorizontal += 360.0; 
     else if(player->rotHorizontal > +360.0) 
      player->rotHorizontal -= 360.0; 

     player->rotVertical += 360.0 * dy; 

     if (player->rotVertical > MAX_ROTATION_UP) { 
      player->rotVertical = MAX_ROTATION_UP; 
     } else if (player->rotVertical < -MAX_ROTATION_UP) { 
      player->rotVertical = -MAX_ROTATION_UP; 
     } 

    } 
// int diffX = event->pos().x() - lastPos.x() % 20; 
// int diffY = event->pos().y() - lastPos.y() % 20; 
// if (diffY > 10 || diffX > 10 || diffY < -10 || diffX < -10) { 
//  QPoint glob = mapToGlobal(QPoint(this->pos().x() + width()/2, this->pos().y() + height()/2)); 
//  QCursor::setPos(glob); 
// } 
    lastPos = event->pos(); 
    QGLWidget::mouseMoveEvent(event); 
} 

マウスを中央に置くコードをコメントアウトしました。これがうまくいくなら、私は左クリック領域に配置します。固定

+0

人々は彼らのカーソルを「盗む」、あなたはこれをしたい理由について詳しく説明できることをアプリケーションに難色を示す傾向がありますか?おそらくもっと良い解決策があります。 – cmannett85

+0

これはGUIを備えたアプリケーションですが、ウィジェットの1つは、一人称シューティングゲームのように画面の端に触れないようにマウスを必要とします。つまり、常に中央に留まります。 – RobotRock

+1

しかし、入力したウィジェットはどのように残していますか?一人称シューティングゲームもカーソルを隠し、マウスの動きのデルタを使います。私はQGLWidgetを使用してCADデータを表示し、ユーザーはマウスを使用してシーンをナビゲートし、マウスイベントはすべてのピクセルの変更(リフレッシュレート)に与えられます。ですから、マウスイベントが高密度でないのはなぜでしょうか?あなたは 'QWidget :: mouseMoveEvent(QMouseEvent * event)'をオーバーライドしていますか? – cmannett85

答えて

2

void World::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) { 

     GLfloat dx = GLfloat(event->x() - lastPos.x())/width(); 
     GLfloat dy = GLfloat(event->y() - lastPos.y())/height(); 

     player->rotHorizontal += 360.0 * dx; 
     if(player->rotHorizontal < 0.0) 
      player->rotHorizontal += 360.0; 
     else if(player->rotHorizontal > +360.0) 
      player->rotHorizontal -= 360.0; 

     player->rotVertical += 360.0 * dy; 

     if (player->rotVertical > MAX_ROTATION_UP) { 
      player->rotVertical = MAX_ROTATION_UP; 
     } else if (player->rotVertical < -MAX_ROTATION_UP) { 
      player->rotVertical = -MAX_ROTATION_UP; 
     } 

    } 
    QPoint glob = mapToGlobal(QPoint(width()/2,height()/2)); 
    QCursor::setPos(glob); 
    lastPos = QPoint(width()/2,height()/2); 
    QGLWidget::mouseMoveEvent(event); 
} 
+0

しかし、 'QCursor :: setPos'を呼び出すときに' mouseMoveEvent'が再び呼び出されないようにするにはどうすればよいですか?私は同様のことを試してみました。そして、すべての動きが即座に逆転されるので、コントロールが "揺れる"ようになるという問題があります。 – user1488118

+0

申し訳ありませんが、私はこれで問題を抱えていることは全く思い出せませんでした。 Qtフレームワークが変更され、その問題が導入された可能性があります。 – RobotRock

関連する問題