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();
- }
![](http://static.blog.csdn.net/images/save_snippets.png)
在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 (不写邀请码,没有现金送) 国 ...
随机推荐
- 学习鸟哥的Linux私房菜笔记(10)——bash2
七.命令行表达式 命令行输出--" " 将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符,则转义. 双引号不能将 \ $ ` ! 符号的特殊功能禁止 命令行输出--' ...
- 【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 ...
- DM365 IPNC软件架构具体解释
于2013在上半场 - 年DM365.DM368的IPNC(网络摄像机)与稳定性测试工作产品结束. 1.简单介绍: TI针对TMS320DM365.DM368进行了DVR和IPNC的应用方案參考.DV ...
- Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ignore等7个属性,还可以横竖分开)
1.Qt布局的作用 Qt的布局是通过布局管理器来实现的,布局管理器负责在父类窗口部件区域构建子窗口部件,使得放置在窗体中的每个窗口部件都有一个适合的大小和位置,并且能够随着应用程序本身的变化而变化从而 ...
- C# WPF 低仿网易云音乐(PC)Banner动画控件
原文:C# WPF 低仿网易云音乐(PC)Banner动画控件 由于技术有限没能做到一模一样的动画,只是粗略地做了一下.动画有点生硬,还有就是没做出网易云音乐的立体感.代码非常简单粗暴,而且我也写有很 ...
- 图解Http协议 url长度限制
http请求报文的格式 一般请求所带有的属性: http响应报文的格式: 响应首部一般包含如下内容: 一.技术基石及概述 问:什么是HTTP? 答:HTTP是一个客户端和服务器端请求和响应的标准TCP ...
- WPF中的菜单模板
原文:WPF中的菜单模板 资源字典代码如下: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xa ...
- Centos下一个server安装的版本号mysql
首先这里说的是这里的路径.以及语句都是在网上看了非常多错误后自己实践后改动过来的,希望对大家实用. 这里在安装的时候要按着我的这个顺序.否则可能会由于路径错误而找不到对应的指令. 一.安装cmake ...
- Java数组List换算方法
1.List转换到一个数组.(这里List它是实体是ArrayList) 调用ArrayList的toArray方法. toArray public <T> T[] toArray(T[] ...
- WPF中样式和行为和触发器
原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...