在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. CentOS 配置远程主机ssh免密登录

    ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...

  2. Ubuntu下一个python的BeautifulSoup和rsa安装方法---信息检索project2部分:微博爬行要求python包裹

    后果<信息检索>第二project,微博具有抓取数据,再处理.师兄给了代码.让慢慢爬.可是在ubuntu下.少了非常多python软件包.须要安装. 1.首先执行时.说少了python.B ...

  3. Dll注入技术之消息钩子

    转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个 ...

  4. SQLite的查询优化

    SQLite是个典型的嵌入式DBMS,它有很多优点,它是轻量级的,在编译之后很小,其中一个原因就是在查询优化方面比较简单,它只是运用索引机制来进行优化的,经过对SQLite的查询优化的分析以及对源代码 ...

  5. spring quartz使用多线程并发“陷阱”

    定义一个job:ranJob,设置每秒执行一次,设置不允许覆盖并发执行 <bean id="rankJob" class="com.chinacache.www.l ...

  6. 检测鼠标指针的改变(使用GetCursorInfo API函数)

    第一步:定义全局变量用于状态改变时的对比 var Form1: TForm1; OldCI:HICON; 第二步:添加Timer组件,Interval设置随意一般50就可以了. 增加Memo组件用于记 ...

  7. Gram 矩阵性质及应用

    v1,v2,-,vn 是内积空间的一组向量,Gram 矩阵定义为: Gij=⟨vi,vj⟩,显然其是对称矩阵. 其实对于一个XN⋅d(N 个样本,d 个属性)的样本矩阵而言,X⋅X′ 即为 Gram ...

  8. Qt图片自适应窗口控件大小(使用setScaledContents)

    最近在用Qt设计一个小程序,想让一幅图片自适应窗口大小,由于本人比较笨,一直找不到好方法.找到了很多方法但都会出一些小问题, 刚刚摸索出解决办法了,在些记录. 思想: 1 显示图像是用QLabel2 ...

  9. Qt如何绘制(简单深刻,fearlazy的系列文章)

    我觉得绘制只需要考虑几个问题.简单地说就是谁在什么地方画什么? 在Qt中可以这么回答:QPainter在QPainterDevice中画想画的东西. 举个例子:用QtCreator向导新建一个项目,基 ...

  10. 在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)

    在Linux下使用MinGW静态交叉编译带有zlib的libcurl libcurl是一个跨平台的.易用的.强大的网络库.在大部分Linux发行版中都有编译好的二进制包可供使用,Mac系统更是将其作为 ...