Qt5+OpenGL学习笔记(新手原创→_→)(一、喂,三角形,你好)



  • 目标:画一个白白胖胖的三角形~
    内容:在Qt中使用OpenGL的原生函数,用自定义类渲染一个简单的三角形。

    啊啊啊,最近学习,需要写软件来实现数据可视化。打算使用Qt+OpenGL。网上逛了一圈教程,发现NeHe的OpenGL中文教程还不错。不过那些教程大都还是使用glBegin()之类的函数(是不是叫什么固定管线来的,有这个讲法么,反正已经被淘汰了)。而且Qt4的QGL系列在Qt5之后被QOpenGL系列代替了。
    我自学的时候主要是参照红宝书第八版(虽然我觉得这书小白用有点坑的。。。)还有就是youtube上Jamie King的3D Computer Graphics Using OpenGL系列视频(这个对我帮助还挺多的哈),还有就是Qt的帮助文档加上谷歌和度娘。
    自己学习的时候感觉走了好多弯路,打算写个笔记学习总结下。如果有所帮助就更好啦。
    才疏学浅,还请各位大神指正~

    OK,言归正传。
    我假定你已经完成了Qt5的相关的安装和配置。这一步有很多教程可以查,我就不在这里啰嗦啦~

    第一步,建立ui中窗口与代码的联系~
    首先,添加你的自定义类~右键工程,选择添加新文件。选择C++类。
    0_1454335159413_upload-94e6aaea-3a1f-43d3-af6e-4c62da4bd7f0
    给你的自定义类起个名字吧,基类填写QOpenGLWidget(这样方便点,不在这里写的话手动写也可以哒)
    0_1454335362369_upload-749529d5-c3e2-4f09-b6b6-e790ebf5865e
    打开你自定义类的头文件~
    加入两个头文件,一个是QOpenGLWidget,还有一个是QOpenGLFunction_...,可以根据你的需要选择版本号的啦。构造函数要修改,因为ui中widget貌似构造函数是要传一个QWidget型指针的。修改了头文件中的之后别忘记修改源文件中构造函数的来保持一致。
    还有继承QOpenGLFunction…类来使用原生的OpenGL函数。
    还要重载三个函数啦,paintGL()每次执行来画图哒;initializeGL()执行一次初始化哒;resizeGL()当窗口大小变化的策略。
    0_1454335389955_upload-bcf6fbe0-c5ee-4dcc-bb7c-e7caef064300
    接下来我们来到我们自定义类的源文件里面~
    0_1454335422022_upload-9a4eae2b-ce52-4ff2-883c-a75e58eeaa03
    把它们三兄弟打出来后~
    在initialzeGL()里,代码如下
    void MyGLWidget::initializeGL()
    {
    initializeOpenGLFunctions();
    //顶点数组
    GLfloat verts[]={
    +0.0f, +1.0f,
    +1.0f, -1.0f,
    -1.0f, -1.0f,
    };

    GLuint myBufferID;
    glGenBuffers(1,&myBufferID);
    glBindBuffer(GL_ARRAY_BUFFER,myBufferID);
    glBufferData(GL_ARRAY_BUFFER,sizeof(verts),verts,GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);
    

    }

    我特别想强调的是initializeOpenGLFunctions()这个函数,在使用OpenGL原生函数的地方之前,要加上这个函数的(加一个就够了~),不然会报错的。
    其它的代码的含义我下一个文章再写(主要是感觉自己理解的不够TvT,需要时间消化~~)。
    在paintGL()里,代码如下
    void MyGLWidget::paintGL()
    {
    initializeOpenGLFunctions();
    glDrawArrays(GL_TRIANGLES,0,3);
    }
    这里就一个绘图的指令。

    我们再来切换到ui设计界面
    从Display Widgets中拖一个OpenGLWidget进来。记得把它加到一个layout里面(可以用随便个什么东西组合下,比如我选了个vertical spacer组合,记得sizePolicy里选Expanding,这样比较好拉伸…)。
    0_1454335487749_upload-cfa1fc06-411f-46bf-a2f9-4ce649a97816
    右键widget选择”提升为”,在提升的类名称中输入名称,选择添加。
    0_1454335526981_upload-21b8a55e-a5e4-4392-8d7b-543b481a5ef4
    之后选中了添加的类选择提升。

    之后构建运行,就得到了一个白白胖胖的三角形~~
    0_1454335541233_upload-66b9a301-5fcd-40d1-a720-bf2755f4d4e8

    用到的源程序:
    http://pan.baidu.com/s/1eRbf2W6

    后语:
    这是第一次写这类东西,感觉有点力不从心。有些地方感觉写的不好,下一个笔记我会努改正的。



  • 的确啊,可以从Designer中拖取OpenGL Widget到窗体中,这样就方便了。


 

最近的回复

  • 0_1531879249244_9090909.jpg
    各位上午好哦。很高兴告诉大家,我们的萌梦社区又进行了一波更新了!
    这次主要更新在论坛代码层面上的,也就是说我们根据NodeBB官方的指示,将论坛从1.9.3升级到了1.10.1了!整个升级过程会产生一些服务暂停的现象,不过没有关系,很快就可以得到恢复,现在咱们可以顺利地在新的论坛上玩耍了!
    这次更新按照NodeBB官方的说法,主要在论坛的稳定性和迎合欧盟的GPDR政策(隐私权保护政策)上,也就是说,咱们论坛默认是支持用户的隐私权保护的~不要担心自己的隐私会被黑客利用什么的,但是大家还是要保护好平时论坛登录的密码哦。合适的时候还是使用浏览器的记住密码功能~

    此外,之前萌梦论坛之前的SSL加密是免费的,费时效果又不好。在手机浏览器上显示并非可靠的颁发者,现在换了新的证书,感觉好了不少。现在又可以在论坛上玩耍啦。

    好了,就是这样~

    阅读更多
  • @jiangcaiyang 是不支持QVector3D类型么,需要引用头文件还是需要转换类型呢

    阅读更多
  • 可能是Qt制作的Python绑定Shiboken遇到了问题。求先行者能够解忧~😵

    阅读更多
  • 0_1531804634749_5.jpg
    我使用的是PyCharm作为IDE,下载了Qt for Python(使用Qt 5.11),并且使用git克隆了pyside的源代码 + 例子。因为自己对OpenGL感兴趣,所以随手运行了一个例子。首先是PyOpenGL没有安装。

    0_1531804316021_1f365ea0-46b3-460d-9a00-c8cdeccf98af-image.png

    通过对话框弹出的命令,在terminal上运行

    python -m pip install PyOpenGL PyOpenGL_accelerate

    就可以了。

    虽然窗体以及3D内容出来了,但是命令提示符中会出现一些问题:

    D:/QtProject/pyside-setup/examples/opengl/hellogl2.py:394: RuntimeWarning: SbkConverter: Unimplemented C++ array type. self.program.setUniformValue(self.lightPosLoc, QVector3D(0, 0, 70)) D:/QtProject/pyside-setup/examples/opengl/hellogl2.py:423: RuntimeWarning: SbkConverter: Unimplemented C++ array type. self.program.setUniformValue(self.projMatrixLoc, self.proj) D:/QtProject/pyside-setup/examples/opengl/hellogl2.py:424: RuntimeWarning: SbkConverter: Unimplemented C++ array type. self.program.setUniformValue(self.mvMatrixLoc, self.camera * self.world) D:/QtProject/pyside-setup/examples/opengl/hellogl2.py:426: RuntimeWarning: SbkConverter: Unimplemented C++ array type. self.program.setUniformValue(self.normalMatrixLoc, normalMatrix)

    刚学习Python,还不清楚是怎么回事,怎么解决才好。

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔