Изменение изображения курсора при наведении курсора на объект, нарисованный в OpenGL, и отображение переменных объекта - PullRequest
0 голосов
/ 02 октября 2019

В настоящее время я работаю над проектом, в котором я использую C ++, OpenGL, Qt 5.9.2 и Microsoft Visual Studio Professional 2015 в 64-разрядной операционной системе Windows 10 Pro.

У меня есть пользовательский интерфейс, который я создал, и в этом пользовательском интерфейсе есть QGLWidget, который я использую для процессов рисования, с другими виджетами, такими как кнопки и dockWidget. У меня есть класс Ball, и у него есть переменные (distance (double) и angle (int)), которые определяют, где будет отображаться экземпляр этого Ball внутри QGLWidget. В классе мяча есть еще 2 переменные: id (int), model (String) и year (int). Любой другой процесс рисования рисует линии, кроме рисунков Ball.

Рисунки являются двухмерными.

Каждый шар имеет один и тот же цвет (rgb)!

Первая проблема: Я хочу щелкнуть левой кнопкой мыши на одном из экземпляров Ball иЯ хочу отобразить его идентификатор, модель и год в DockWidget.

Вторая проблема: Делая то, о чем я упоминал в разделе «Первая проблема». Я хочу, чтобы изображение курсора изменялось при наведении курсора на любой из экземпляров 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
}

Исходя из этого, это проблема комплектования, и есть несколько сведений о нейв интернете, но я не использую GLUT и не использую шейдеры. Поэтому в свете всего этого я не смог найти эффективного решения или подсказки о том, как мне достичь всего, чего я хочу.

Я был бы очень рад, если бы кто-нибудь мог помочь мне хотя бы с одной из этих проблем. .

1 Ответ

0 голосов
/ 23 октября 2019

Я сейчас закончил работу с проектом. Я подумал, что должен дать ответ на мой вопрос, если кто-то с подобной проблемой столкнется с моим вопросом в будущем.

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).
            }
        }
    }
}

Это было решением для моей Первая проблема ,Я был бы рад, если бы кто-то мог ответить на мою вторую проблему в комментарии или как-то ответить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...