Qt5下OpenGL程序的新写法
在Qt5中,引入了QOpenGL*系列类,以取代Qt4时代的QGL*系列类。
下面是从Qt5例子中抠出的两种OpenGL程序模板,方便参考。
第一种写法:
- #ifndef TRIANGLEWINDOW_H
- #define TRIANGLEWINDOW_H
- #include <QWindow>
- #include <QOpenGLFunctions>
- class QPainter;
- class QOpenGLContext;
- class QOpenGLPaintDevice;
- class TriangleWindow : public QWindow, protected QOpenGLFunctions
- {
- Q_OBJECT
- public:
- explicit TriangleWindow(QWindow *parent = 0);
- ~TriangleWindow();
- virtual void render(QPainter *);
- virtual void render();
- virtual void initialize();
- public slots:
- void renderNow();
- protected:
- void exposeEvent(QExposeEvent *);
- void resizeEvent(QResizeEvent *);
- private:
- bool m_update_pending;
- QOpenGLContext *m_context;
- QOpenGLPaintDevice *m_device;
- };
- #endif // TRIANGLEWINDOW_H
实现代码如下:
- #include "trianglewindow.h"
- #include <QCoreApplication>
- #include <QPainter>
- #include <QOpenGLContext>
- #include <QOpenGLPaintDevice>
- TriangleWindow::TriangleWindow(QWindow *parent) :
- QWindow(parent)
- , m_update_pending(false)
- , m_context(0)
- , m_device(0)
- {
- setSurfaceType(QWindow::OpenGLSurface);
- }
- TriangleWindow::~TriangleWindow()
- {
- delete m_device;
- }
- void TriangleWindow::render(QPainter *painter)
- {
- Q_UNUSED(painter);
- }
- void TriangleWindow::render()
- {
- if (!m_device)
- m_device = new QOpenGLPaintDevice;
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- m_device->setSize(size());
- QPainter painter(m_device);
- render(&painter);
- }
- void TriangleWindow::initialize()
- {
- glClearColor(1, 0, 0, 1);
- }
- void TriangleWindow::renderNow()
- {
- if (!isExposed())
- return;
- m_update_pending = false;
- bool needsInitialize = false;
- if (!m_context) {
- m_context = new QOpenGLContext(this);
- m_context->setFormat(requestedFormat());
- m_context->create();
- needsInitialize = true;
- }
- m_context->makeCurrent(this);
- if (needsInitialize) {
- initializeOpenGLFunctions();
- initialize();
- }
- render();
- m_context->swapBuffers(this);
- }
- void TriangleWindow::exposeEvent(QExposeEvent *event)
- {
- Q_UNUSED(event);
- if (isExposed())
- renderNow();
- }
- void TriangleWindow::resizeEvent(QResizeEvent *event)
- {
- Q_UNUSED(event);
- if (isExposed())
- renderNow();
- }
main方法:
- #include "trianglewindow.h"
- #include <QGuiApplication>
- int main(int argc, char **argv)
- {
- QGuiApplication app(argc, argv);
- QSurfaceFormat format;
- format.setSamples(4);
- TriangleWindow window;
- window.setFormat(format);
- window.resize(640, 480);
- window.show();
- return app.exec();
- }
另一种写法:
- #ifndef TRIANGLEWINDOW_H
- #define TRIANGLEWINDOW_H
- #include <QWindow>
- class QOpenGLContext;
- class Renderer : public QObject
- {
- Q_OBJECT
- public:
- explicit Renderer(const QSurfaceFormat &format, Renderer *share = 0, QScreen *screen = 0);
- QSurfaceFormat format() const { return m_format; }
- public slots:
- void render(QSurface *surface, const QColor &color, const QSize &viewSize);
- private:
- void initialize();
- bool m_initialized;
- QSurfaceFormat m_format;
- QOpenGLContext *m_context;
- };
- class TriangleWindow : public QWindow
- {
- Q_OBJECT
- public:
- explicit TriangleWindow(const QSharedPointer<Renderer> &renderer);
- signals:
- void needRender(QSurface *surface, const QColor &color, const QSize &viewSize);
- private slots:
- void render();
- protected:
- void exposeEvent(QExposeEvent *);
- private:
- const QSharedPointer<Renderer> m_renderer;
- };
- #endif // TRIANGLEWINDOW_H
实现文件:
- #include "trianglewindow.h"
- #include <QOpenGLContext>
- Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *screen)
- : m_initialized(false)
- , m_format(format)
- {
- m_context = new QOpenGLContext(this);
- if (screen)
- m_context->setScreen(screen);
- m_context->setFormat(format);
- if (share)
- m_context->setShareContext(share->m_context);
- m_context->create();
- }
- TriangleWindow::TriangleWindow(const QSharedPointer<Renderer> &renderer)
- : m_renderer(renderer)
- {
- setSurfaceType(QWindow::OpenGLSurface);
- setFlags(Qt::Window | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
- setGeometry(QRect(10, 10, 640, 480));
- setFormat(renderer->format());
- create();
- connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)),
- renderer.data(), SLOT(render(QSurface *, const QColor &, const QSize &)));
- }
- void TriangleWindow::exposeEvent(QExposeEvent *)
- {
- render();
- }
- void TriangleWindow::render()
- {
- if (isExposed())
- emit needRender(this, QColor(255, 0, 0), size());
- }
- void Renderer::render(QSurface *surface, const QColor &color, const QSize &viewSize)
- {
- if (!m_context->makeCurrent(surface))
- return;
- if (!m_initialized) {
- initialize();
- m_initialized = true;
- }
- glViewport(0, 0, viewSize.width(), viewSize.height());
- glClearColor(color.redF(), color.greenF(), color.blueF(), color.alphaF());
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- m_context->swapBuffers(surface);
- }
- void Renderer::initialize()
- {
- glClearColor(0.1f, 0.1f, 0.2f, 1.0f);
- }
main方法:
- #include "trianglewindow.h"
- #include <QGuiApplication>
- int main(int argc, char *argv[])
- {
- QGuiApplication app(argc, argv);
- QSurfaceFormat format;
- format.setDepthBufferSize(16);
- format.setSamples(4);
- QSharedPointer<Renderer> renderer(new Renderer(format));
- TriangleWindow *window = new TriangleWindow(renderer);
- window->resize(640, 480);
- window->setVisible(true);
- return app.exec();
- }

在Qt5,推荐使用QOpenGL*系列的类。
原文链接:http://blog.csdn.net/fuyajun01/article/details/9246231/
http://blog.csdn.net/caoshangpa/article/details/51103402
Qt5下OpenGL程序的新写法的更多相关文章
- MAC 下用 Common Lisp 调试 OpenGL 程序
MAC 下用 Common Lisp 调试 OpenGL 程序 环境搭建 运行环境: OSX 10.11.3 EI Capitan Common Lisp: SBCL 使用 SBCL, 首先要安装这几 ...
- 【VS开发】【OpenGL开发】OpenGL---Windows下配置与第一个OpenGL程序
面记录一下Windows下配置OpenGL与我的第一个OpenGL程序. 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- 第一个openGL程序
一.工具的安装 因为要写C++程序,为了便捷,这里我安装的Visual Studio: 免费使用90天!安装好了之后,我们要为我们的开发安装相应的工具集: 因为我是要在windows上跑的,所以选择如 ...
- 【OpenGL】详解第一个OpenGL程序
写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下. ...
- MFC下OpenGL入门(可以用)
MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...
- Windows7+VS2012下OpenGL 4的环境配置
系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...
- [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}
IOS数组.字典.NSNumber 新写法—— @[].@{} //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...
- 【M32】在未来时态下发展程序
1.在未来时态下发展程序,就是接受“事情总会变化”的事实,并准备应对之策. 2.记住,程序的维护者通常不是最初的开发者,因此,设计和实现的时候,应该考虑别人更好地理解,修改自己的程序. 3.重要的一点 ...
- Linux下C程序的编辑,编译和运行以及调试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
随机推荐
- Winfrom 屏蔽Alt+F4
/// <summary> /// 屏蔽Alt+F4 /// </summary> /// <param name="m">要处理的 Windo ...
- 【b604】2K进制数
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 设r是个2K进制数,并满足以下条件: (1)r至少是个2位的2K进制数. (2)作为2K进制数,除最后一 ...
- 执行hdfs namenode -importCheckpoint时出现No image directories available!
在https://issues.apache.org/jira/browse/HDFS-4705找到了答案需要在hdfs-site.xml中配置 <!--指定fsimage存储目录--> ...
- 【50.49%】【codeforces 731B】Coupons and Discounts
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- React中的state与props的再理解
props可以看做是 property 的缩写的复数,可以翻译为属性,类似于HTML 标签的自定义属性.在大多数React教程里讲 state 和 props 主要的区别在于 props 是不可变的, ...
- Spring Boot with JSP and Tiles3
Spring Boot with JSP and Tiles3 Using tiles and jsp on a Spring Boot 1.2.7 project file: pom.xml und ...
- WPF中的Generic.xaml, theme以及custom control
原文:WPF中的Generic.xaml, theme以及custom control 在Visual Studio中创建自定义控件时,所有控件都将添加到/Themes/Generic.xaml. 最 ...
- Scala Control Structures
Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Struc ...
- uwp - 控件精确移动动画
原文:uwp - 控件精确移动动画 先看效果图: 一共有8个GRID,黄色的负责移动,其他7个负责定位.新建一个页面page,替换默认代码: <UserControl.Resources> ...
- xshell登陆Win10 Linux子系统
原文:xshell登陆Win10 Linux子系统 版权声明:转载请注明出处 https://blog.csdn.net/anychenp/article/details/78922320 修改端口 ...