我目前正在研究一个在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,也没有使用任何着色器。因此,鉴于所有这些,我无法找到任何有效的解决方案或线索,说明如何才能实现自己想要的一切。
如果有人可以帮助我解决其中至少一个问题,我将感到非常高兴。
答案 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).
}
}
}
}
这是我的第一个问题的解决方案。如果有人可以在评论中回答我的第二个问题或以某种方式回答,我将感到很高兴。