将鼠标悬停在OpenGL绘制的对象上并显示对象的变量时,更改光标图像

时间:2019-10-02 08:15:14

标签: c++ qt opengl

我目前正在研究一个在64位操作系统Windows 10 Pro上使用C ++,OpenGL,Qt 5.9.2和Microsoft Visual Studio Professional 2015的项目。

我有一个已创建的用户界面,并且在该用户界面中有一个QGLWidget,我正在使用它来进行绘制过程,还有其他小部件(例如按钮和dockWidget)。我有一个Ball类,它具有变量(distance(double)和angle(int)),该变量确定将在QGLWidget内绘制Ball实例的位置。 Ball类还有2个变量,分别是id(int),model(String)和year(int)。每个其他绘制过程都会绘制除Ball绘制之外的线。

工程图是二维的。

每个球都具有相同的颜色(rgb)!

第一个问题:我想在Ball实例上单击鼠标左键,然后在ockDockWidget上显示其ID,型号和年份。

第二个问题:在做我在“第一个问题”部分提到的内容时。我希望将光标图像悬停在任何Ball实例上方时更改,而不要更改为默认Windows鼠标光标。

我创建了一个检查MouseEvent是否为LeftClick的函数:

void DisplayManager::mousePressEvent(QMouseEvent* ev) { 

    if (ev->buttons() & Qt::LeftButton) { // Balls Are Green
        if(// CHECK IF THERE IS A BALL AT THE CLICKED COORDINATES) {
            // DISPLAY THE X and Y OF THE BALL AT THE DOCK WIDGET
        }
    }
}

这是我的initializeGL函数:( DisplayManager是我的QGLWidget的名称

void DisplayManager::initializeGL() {
    glEnable(GL_COLOR_MATERIAL); // Enables the changing of the draw color with glColor() functions
    glColor3f(0.0, 1.0, 0.0);

    glEnable(GL_DEPTH_TEST);
    glClearColor(0, 0, 0, 1); //sets a black background 1 0 0 1
}

基于这是一个Picking问题,并且在互联网上有关于它的一些信息,但是我没有使用GLUT,也没有使用任何着色器。因此,鉴于所有这些,我无法找到任何有效的解决方案或线索,说明如何才能实现自己想要的一切。

如果有人可以帮助我解决其中至少一个问题,我将感到非常高兴。

1 个答案:

答案 0 :(得分:0)

我目前已完成该项目的工作。我认为我应该为我的问题提供答案,以防将来有人遇到类似问题。

void DisplayManager::mousePressEvent(QMouseEvent* ev) {

    // The processes that are being executed after a left mouse button click on the DisplayManager.
    if (ev->buttons() & Qt::LeftButton) {
        double aspectRatio = openGLWidgetWidth / openGLWidgetHeight;
        int xOfClicked = ev->x() - (openGLWidgetWidth / 2);
        int yOfClicked = - (ev->y() - (openGLWidgetHeight / 2));

        // The variable to be used for calculating fault tolerance of the click event.
        int distanceBetweenPressAndDraw = 0;

        // Executes the processes inside for every ball in vector.
        for (int i = 0; i < ballVector.length(); i++) {

            // Calculates the screen coordinates of the i'th ball.
            int rangeOfBallInScreenDistance = rangeToScreenDistance(ballVector.at(i).range);
            double screenXOfBall = rangeOfBallInScreenDistance * sin(ballVector.at(i).degree * DEGTORAD);
            double screenYOfBall = rangeOfBallInScreenDistance * cos(ballVector.at(i).degree * DEGTORAD);

            // Calculates the distance between pressed position and the i'th ball according to the screen coordinates.
            distanceBetweenPressAndDraw = sqrt(pow((screenXOfBall - xOfClicked), 2) + pow((screenYOfBall - yOfClicked), 2));

            // Decides if the clicked position is a ball (considering the fault tolerance).
            if (distanceBetweenPressAndDraw < 10) {
                emit printXY(QPointF(xOfClicked, yOfClicked)); // Prints the screen coordinates of the clicked positions (At the Dock Widget inside Main Window).
            }
        }
    }
}

这是我的第一个问题的解决方案。如果有人可以在评论中回答我的第二个问题或以某种方式回答,我将感到很高兴。