在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

最新文章

  1. PBOC~PPT-补充内容B(转)
  2. 关于ajax跨域请求(cross Domain)
  3. Nginx配置proxy_pass
  4. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
  5. JS面向(基于)对象编程--三大特征
  6. 微信公众平台接口API
  7. https post
  8. 走进安卓的重灾区----video
  9. for循环 + setTimeout 结合的烂大街的面试题
  10. 【一天一道LeetCode】#125. Valid Palindrome
  11. 浅谈基于WOPI协议实现跨浏览器的Office在线编辑解决方案
  12. Axios发送请求时params和data的区别
  13. UDP协议的例子
  14. jquery遍历获取每一行数据进行对比
  15. winSockets编程(二)socket函数
  16. java基础进阶二:HashMap实现原理分析
  17. sqlserver批量删除字段 msrepl_tran_version
  18. Google MapReduce到底解决什么问题?
  19. SQL Server中SCAN 和SEEK的区别
  20. centos上自动执行脚本执行php文件

热门文章

  1. erlang连接mysql
  2. vuex与vue-router学习方案
  3. 【29.82%】【codeforces 703D】Mishka and Interesting sum
  4. O'Stolz 定理及其应用
  5. wxWidgets初学者导引(2)——下载、安装wxWidgets
  6. zoj 3820 Building Fire Stations(二分法+bfs)
  7. Java--数组和链表的区别以及使用场景
  8. 从 XML 到 XPath
  9. android圆形旋转菜单,而对于移动转换功能支持
  10. Android Studio怎样提示函数使用方法