在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. 学习鸟哥的Linux私房菜笔记(10)——bash2

    七.命令行表达式 命令行输出--" " 将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符,则转义. 双引号不能将 \ $ ` ! 符号的特殊功能禁止 命令行输出--' ...

  2. 【codeforces 776C】Molly's Chemicals

    [题目链接]:http://codeforces.com/contest/776/problem/C [题意] 让你找区间[i,j] 使得sum[i..j]=k^t,这里t=0,1,2,3.. -10 ...

  3. DM365 IPNC软件架构具体解释

    于2013在上半场 - 年DM365.DM368的IPNC(网络摄像机)与稳定性测试工作产品结束. 1.简单介绍: TI针对TMS320DM365.DM368进行了DVR和IPNC的应用方案參考.DV ...

  4. Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ignore等7个属性,还可以横竖分开)

    1.Qt布局的作用 Qt的布局是通过布局管理器来实现的,布局管理器负责在父类窗口部件区域构建子窗口部件,使得放置在窗体中的每个窗口部件都有一个适合的大小和位置,并且能够随着应用程序本身的变化而变化从而 ...

  5. C# WPF 低仿网易云音乐(PC)Banner动画控件

    原文:C# WPF 低仿网易云音乐(PC)Banner动画控件 由于技术有限没能做到一模一样的动画,只是粗略地做了一下.动画有点生硬,还有就是没做出网易云音乐的立体感.代码非常简单粗暴,而且我也写有很 ...

  6. 图解Http协议 url长度限制

    http请求报文的格式 一般请求所带有的属性: http响应报文的格式: 响应首部一般包含如下内容: 一.技术基石及概述 问:什么是HTTP? 答:HTTP是一个客户端和服务器端请求和响应的标准TCP ...

  7. WPF中的菜单模板

    原文:WPF中的菜单模板 资源字典代码如下: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xa ...

  8. Centos下一个server安装的版本号mysql

    首先这里说的是这里的路径.以及语句都是在网上看了非常多错误后自己实践后改动过来的,希望对大家实用. 这里在安装的时候要按着我的这个顺序.否则可能会由于路径错误而找不到对应的指令. 一.安装cmake ...

  9. Java数组List换算方法

    1.List转换到一个数组.(这里List它是实体是ArrayList) 调用ArrayList的toArray方法. toArray public <T> T[] toArray(T[] ...

  10. WPF中样式和行为和触发器

    原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...