如何在QGLWidget中查找OpenGL的等效函数?

时间:2013-07-22 14:28:38

标签: qt glut qglwidget

我是OpenGL和Glut的新手。 Glut实施了一个项目。我用Google搜索并发现Qt中有一个名为QGLWidget的OpenGL实现。但是,我很难将旧的Glut代码转换为新的Qt代码,因为我不知道如何在Qt中找到Glut函数的等效函数。部分代码如下所示:

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(gray1->width,gray1->height);
glutInitWindowPosition(100,100);
glutCreateWindow("hello");
init();
glutDisplayFunc(&display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMotionFunc(mouse_move);
glutMainLoop();

Qt的文档中不存在上述过剩函数。所以我的问题是如何在QGLWidget的函数中找到等效的glut函数?

2 个答案:

答案 0 :(得分:6)

您需要实现自己继承自QGLWidget的类,例如:

    class GLWidget : public QGLWidget
    {
        Q_OBJECT

    public:
        GLWidget(QWidget *parent = 0);

    protected:
        void initializeGL();
        void resizeGL(int w, int h);
        void paintGL(); 

        void mousePressEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void mouseReleaseEvent(QMouseEvent *event);

    };

您还需要覆盖三个重要的功能, initializeGL(),您正在准备OpenGL。 resizeGL(),如果面板调整大小,则更新视口和投影矩阵, paintGL()实际渲染。

当然,窗口初始化由Qt。

处理

对于鼠标事件,您可以覆盖三个函数: mousePressEvent() mouseMoveEvent() mouseReleaseEvent()

void GLWidget::initializeGL() 
{
    glClearColor(0.5, 0.5, 0.5, 1.0);
}

void GLWidget::resizeGL(int width, int height) 
{   
    glViewport(0, 0, width(), height());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width(), 0, height());
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void GLWidget::paintGL() 
{
    glClear(GL_COLOR_BUFFER_BIT);

    // draw a red triangle
    glColor3f(1,0,0);
    glBegin(GL_POLYGON);
    glVertex2f(10,10);
    glVertex2f(10,600);
    glVertex2f(300,10);
    glEnd();
}

答案 1 :(得分:0)

行。你看过HelloGL样本了吗? 因此,您将学习如何显示QGLWidget并处理鼠标输入。我想这就是你要找的东西。 由于Qt提供SIGNAL和SLOTS输入处理有点不同但也非常直观。因此,您必须将鼠标SIGNALS连接到您的SLOTS。那些SLOTS将处理鼠标事件。

但是看看样本,它非常直观。