重载鼠标事件:
void AxMapControl::mousePressEvent(QMouseEvent* e) { switch(currentTool) { case AX_DRAW_DIRECTION: { if (e->button() == Qt::LeftButton) { QPoint screenPt=e->pos(); qglviewer::Vec orig1, dir1; camera()->convertClickToLine(screenPt, orig1, dir1); double valueZ=0; double a = ( valueZ- orig1.z) / dir1.z; Pnt.z = valueZ; Pnt.x = orig1.x + dir1.x * a; Pnt.y = orig1.y + dir1.y * a; //QMessageBox::information(this, "PickPoint", QString::number(Pnt.x) + "," + QString::number(Pnt.y)); } break; } } QGLViewer::mousePressEvent(e); }
重载绘制方法
void AxMapControl::draw() { if (pimpl->points.size()>0) { QMutexLocker locker(&pimpl->mutex_); glColor3f(255/255.0, 69/255.0, 0.0); draw_3d_points(pimpl->points); } if (pimpl->pointCloudOneFrame.size()>0) { QMutexLocker locker(&pimpl->mutex_); glColor3f(255/255.0, 69/255.0, 0.0); for (vector<Point3ds>::const_iterator it = pimpl->pointCloudOneFrame.begin();it != pimpl->pointCloudOneFrame.end(); ++it) { const Point3ds& p = *it; if (p.size()>0) { draw_3d_points(p); } } } if (!glImg.isNull()) { glNormal3f(0.0, 0.0, 1.0); glBegin(GL_QUADS); glTexCoord2f(0.0, 1.0-v_max); glVertex2f(-u_max*ratio,-v_max); glTexCoord2f(0.0, 1.0); glVertex2f(-u_max*ratio, v_max); glTexCoord2f(u_max, 1.0); glVertex2f( u_max*ratio, v_max); glTexCoord2f(u_max, 1.0-v_max); glVertex2f( u_max*ratio,-v_max); glEnd(); } if (currentTool==AX_DRAW_DIRECTION) { glBegin(GL_LINES); glColor3f(255/255.0, 0/255.0, 0.0); glVertex3fv(currentPose); glVertex3fv(Pnt); glEnd(); }
效果: