在Qt5中,引入了QOpenGL*系列类,以取代Qt4时代的QGL*系列类。

下面是从Qt5例子中抠出的两种OpenGL程序模板,方便参考。

第一种写法:

  1. #ifndef TRIANGLEWINDOW_H
  2. #define TRIANGLEWINDOW_H
  3. #include <QWindow>
  4. #include <QOpenGLFunctions>
  5. class QPainter;
  6. class QOpenGLContext;
  7. class QOpenGLPaintDevice;
  8. class TriangleWindow : public QWindow, protected QOpenGLFunctions
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit TriangleWindow(QWindow *parent = 0);
  13. ~TriangleWindow();
  14. virtual void render(QPainter *);
  15. virtual void render();
  16. virtual void initialize();
  17. public slots:
  18. void renderNow();
  19. protected:
  20. void exposeEvent(QExposeEvent *);
  21. void resizeEvent(QResizeEvent *);
  22. private:
  23. bool m_update_pending;
  24. QOpenGLContext *m_context;
  25. QOpenGLPaintDevice *m_device;
  26. };
  27. #endif // TRIANGLEWINDOW_H

实现代码如下:

  1. #include "trianglewindow.h"
  2. #include <QCoreApplication>
  3. #include <QPainter>
  4. #include <QOpenGLContext>
  5. #include <QOpenGLPaintDevice>
  6. TriangleWindow::TriangleWindow(QWindow *parent) :
  7. QWindow(parent)
  8. , m_update_pending(false)
  9. , m_context(0)
  10. , m_device(0)
  11. {
  12. setSurfaceType(QWindow::OpenGLSurface);
  13. }
  14. TriangleWindow::~TriangleWindow()
  15. {
  16. delete m_device;
  17. }
  18. void TriangleWindow::render(QPainter *painter)
  19. {
  20. Q_UNUSED(painter);
  21. }
  22. void TriangleWindow::render()
  23. {
  24. if (!m_device)
  25. m_device = new QOpenGLPaintDevice;
  26. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  27. m_device->setSize(size());
  28. QPainter painter(m_device);
  29. render(&painter);
  30. }
  31. void TriangleWindow::initialize()
  32. {
  33. glClearColor(1, 0, 0, 1);
  34. }
  35. void TriangleWindow::renderNow()
  36. {
  37. if (!isExposed())
  38. return;
  39. m_update_pending = false;
  40. bool needsInitialize = false;
  41. if (!m_context) {
  42. m_context = new QOpenGLContext(this);
  43. m_context->setFormat(requestedFormat());
  44. m_context->create();
  45. needsInitialize = true;
  46. }
  47. m_context->makeCurrent(this);
  48. if (needsInitialize) {
  49. initializeOpenGLFunctions();
  50. initialize();
  51. }
  52. render();
  53. m_context->swapBuffers(this);
  54. }
  55. void TriangleWindow::exposeEvent(QExposeEvent *event)
  56. {
  57. Q_UNUSED(event);
  58. if (isExposed())
  59. renderNow();
  60. }
  61. void TriangleWindow::resizeEvent(QResizeEvent *event)
  62. {
  63. Q_UNUSED(event);
  64. if (isExposed())
  65. renderNow();
  66. }

main方法:

  1. #include "trianglewindow.h"
  2. #include <QGuiApplication>
  3. int main(int argc, char **argv)
  4. {
  5. QGuiApplication app(argc, argv);
  6. QSurfaceFormat format;
  7. format.setSamples(4);
  8. TriangleWindow window;
  9. window.setFormat(format);
  10. window.resize(640, 480);
  11. window.show();
  12. return app.exec();
  13. }

另一种写法:

  1. #ifndef TRIANGLEWINDOW_H
  2. #define TRIANGLEWINDOW_H
  3. #include <QWindow>
  4. class QOpenGLContext;
  5. class Renderer : public QObject
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit Renderer(const QSurfaceFormat &format, Renderer *share = 0, QScreen *screen = 0);
  10. QSurfaceFormat format() const { return m_format; }
  11. public slots:
  12. void render(QSurface *surface, const QColor &color, const QSize &viewSize);
  13. private:
  14. void initialize();
  15. bool m_initialized;
  16. QSurfaceFormat m_format;
  17. QOpenGLContext *m_context;
  18. };
  19. class TriangleWindow : public QWindow
  20. {
  21. Q_OBJECT
  22. public:
  23. explicit TriangleWindow(const QSharedPointer<Renderer> &renderer);
  24. signals:
  25. void needRender(QSurface *surface, const QColor &color, const QSize &viewSize);
  26. private slots:
  27. void render();
  28. protected:
  29. void exposeEvent(QExposeEvent *);
  30. private:
  31. const QSharedPointer<Renderer> m_renderer;
  32. };
  33. #endif // TRIANGLEWINDOW_H

实现文件:

  1. #include "trianglewindow.h"
  2. #include <QOpenGLContext>
  3. Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *screen)
  4. : m_initialized(false)
  5. , m_format(format)
  6. {
  7. m_context = new QOpenGLContext(this);
  8. if (screen)
  9. m_context->setScreen(screen);
  10. m_context->setFormat(format);
  11. if (share)
  12. m_context->setShareContext(share->m_context);
  13. m_context->create();
  14. }
  15. TriangleWindow::TriangleWindow(const QSharedPointer<Renderer> &renderer)
  16. : m_renderer(renderer)
  17. {
  18. setSurfaceType(QWindow::OpenGLSurface);
  19. setFlags(Qt::Window | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
  20. setGeometry(QRect(10, 10, 640, 480));
  21. setFormat(renderer->format());
  22. create();
  23. connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)),
  24. renderer.data(), SLOT(render(QSurface *, const QColor &, const QSize &)));
  25. }
  26. void TriangleWindow::exposeEvent(QExposeEvent *)
  27. {
  28. render();
  29. }
  30. void TriangleWindow::render()
  31. {
  32. if (isExposed())
  33. emit needRender(this, QColor(255, 0, 0), size());
  34. }
  35. void Renderer::render(QSurface *surface, const QColor &color, const QSize &viewSize)
  36. {
  37. if (!m_context->makeCurrent(surface))
  38. return;
  39. if (!m_initialized) {
  40. initialize();
  41. m_initialized = true;
  42. }
  43. glViewport(0, 0, viewSize.width(), viewSize.height());
  44. glClearColor(color.redF(), color.greenF(), color.blueF(), color.alphaF());
  45. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  46. m_context->swapBuffers(surface);
  47. }
  48. void Renderer::initialize()
  49. {
  50. glClearColor(0.1f, 0.1f, 0.2f, 1.0f);
  51. }

main方法:

  1. #include "trianglewindow.h"
  2. #include <QGuiApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QGuiApplication app(argc, argv);
  6. QSurfaceFormat format;
  7. format.setDepthBufferSize(16);
  8. format.setSamples(4);
  9. QSharedPointer<Renderer> renderer(new Renderer(format));
  10. TriangleWindow *window = new TriangleWindow(renderer);
  11. window->resize(640, 480);
  12. window->setVisible(true);
  13. return app.exec();
  14. }

在Qt5,推荐使用QOpenGL*系列的类。

原文链接:http://blog.csdn.net/fuyajun01/article/details/9246231/

http://blog.csdn.net/caoshangpa/article/details/51103402

Qt5下OpenGL程序的新写法的更多相关文章

  1. MAC 下用 Common Lisp 调试 OpenGL 程序

    MAC 下用 Common Lisp 调试 OpenGL 程序 环境搭建 运行环境: OSX 10.11.3 EI Capitan Common Lisp: SBCL 使用 SBCL, 首先要安装这几 ...

  2. 【VS开发】【OpenGL开发】OpenGL---Windows下配置与第一个OpenGL程序

    面记录一下Windows下配置OpenGL与我的第一个OpenGL程序. 第一步:选择一个编译环境    现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...

  3. 第一个openGL程序

    一.工具的安装 因为要写C++程序,为了便捷,这里我安装的Visual Studio: 免费使用90天!安装好了之后,我们要为我们的开发安装相应的工具集: 因为我是要在windows上跑的,所以选择如 ...

  4. 【OpenGL】详解第一个OpenGL程序

    写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下. ...

  5. MFC下OpenGL入门(可以用)

    MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...

  6. Windows7+VS2012下OpenGL 4的环境配置

    系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...

  7. [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}

    IOS数组.字典.NSNumber 新写法—— @[].@{}   //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...

  8. 【M32】在未来时态下发展程序

    1.在未来时态下发展程序,就是接受“事情总会变化”的事实,并准备应对之策. 2.记住,程序的维护者通常不是最初的开发者,因此,设计和实现的时候,应该考虑别人更好地理解,修改自己的程序. 3.重要的一点 ...

  9. Linux下C程序的编辑,编译和运行以及调试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

随机推荐

  1. Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    背景 记录项目中遇到的 关于fastjson jsonobject转string乱序,string转jsonObject乱序问题的解决方案 fastJson issues 问题来源描述参见: http ...

  2. php redis操作具体解释

    phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 非常实用;下面是redis官方提供的命令使用技巧: 下载地址例如以下: https://gith ...

  3. Hexo里如何添加广告

    前期先用Hexo做个人网站,模板可以用https://github.com/828768/maupassant-hexo,关于如何加入广告,可以看一下https://sobaigu.com/hexo- ...

  4. CommonJS里module.exports与exports输出模块的区别

    其实是一个东西,但有些注意点,可以参考CommonJS规范

  5. Linode跨节点迁移:从Tokyo到Fremont

    背景 上一篇博客交代了如何在 Linode 上搭建邮件服务器,并配置好各种协议.记录来投入实际使用. 由于实践过程中,曾经尝试使用明文协议与服务器交流数据,可能泄露了账号.密码信息,造成之后被攻击发送 ...

  6. Android GPS获取当前位置信息

    package com.example.gpstest; import org.apache.http.util.LangUtils; import android.content.Context; ...

  7. 窗体的基类中没有设定大小,所以才不能居中,若要窗体居中,必须使用setfixedsize()函数或者resize()函数设定窗体的大小,居中才能正常使用

    最近开发中,遇到了窗体不能居中的问题,看了网上的很多文章,窗口居中,无非都是move至窗口的中心目标; 有两种方式, 一种在构造函数中直接计算中心坐标; 另一种是在窗口show后再move至相应坐标. ...

  8. 深度学习实战 Tricks

    1. 梯度消失与梯度爆炸 gradient clipping 梯度爆炸:min(grad_max,grad) grad_max:梯度上限 梯度消失:max(grad_min, grad) grad_m ...

  9. WCF寄宿与IIS里时遇到的问题

    [问题总结]WCF寄宿与IIS里时遇到的问题 最近在公司做了一个小的视频处理网站,由于视频处理,网站在不同的服务器上,所以处理视频的时候得在网站服务器上通过wcf请求视频处理服务器处理视频,并将结果返 ...

  10. QT中窗口刷新事件的学习总结(viewport, paintEvent, repaint, update, erase, updatesEnabled)

    一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintEvent ( QPaintEvent ...