1

我是 OpenGL 和 Glut 的新手。Glut 实施了一个项目。我google了一下,发现Qt中有一个OpenGL实现,叫做QGLWidget。但是,我很难将旧的 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 的文档中不存在上述 glut* 函数。所以我的问题是如何在 QGLWidget 的函数中找到等效的 glut 函数?

4

2 回答 2

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();
}
于 2013-07-22T18:15:22.760 回答
0

好的。您看过HelloGL示例吗?因此,您将学习如何显示 QGLWidget 和处理鼠标输入。我想这就是你要找的。由于 Qt 提供 SIGNAL 和 SLOTS 输入处理有点不同,但也非常直观。所以你必须将鼠标信号连接到你的插槽。然后这些 SLOTS 将处理鼠标事件。

但是看示例,它非常直观。

于 2013-07-22T14:44:31.147 回答