一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Qt5下OpenGL程序的新寫法

 特—亮 2015-01-29

在Qt5中,引入了QOpenGL*系列類,以取代Qt4時代的QGL*系列類。


下面是從Qt5例子中摳出的兩種OpenGL程序模板,方便參考。


第一種寫法:

  1. #ifndef TRIANGLEWINDOW_H  
  2. #define TRIANGLEWINDOW_H  
  3.   
  4. #include <QWindow>  
  5. #include <QOpenGLFunctions>  
  6.   
  7. class QPainter;  
  8. class QOpenGLContext;  
  9. class QOpenGLPaintDevice;  
  10.   
  11. class TriangleWindow : public QWindow, protected QOpenGLFunctions  
  12. {  
  13.     Q_OBJECT  
  14. public:  
  15.     explicit TriangleWindow(QWindow *parent = 0);  
  16.     ~TriangleWindow();  
  17.       
  18.     virtual void render(QPainter *);  
  19.     virtual void render();  
  20.     virtual void initialize();  
  21.       
  22. public slots:  
  23.     void renderNow();  
  24.   
  25. protected:  
  26.     void exposeEvent(QExposeEvent *);  
  27.     void resizeEvent(QResizeEvent *);  
  28.   
  29. private:  
  30.     bool m_update_pending;  
  31.   
  32.     QOpenGLContext *m_context;  
  33.     QOpenGLPaintDevice *m_device;  
  34.       
  35. };  
  36.   
  37. #endif // TRIANGLEWINDOW_H  

實現(xiàn)代碼如下:
  1. #include "trianglewindow.h"  
  2.   
  3. #include <QCoreApplication>  
  4. #include <QPainter>  
  5. #include <QOpenGLContext>  
  6. #include <QOpenGLPaintDevice>  
  7.   
  8. TriangleWindow::TriangleWindow(QWindow *parent) :  
  9.     QWindow(parent)  
  10.   , m_update_pending(false)  
  11.   , m_context(0)  
  12.   , m_device(0)  
  13. {  
  14.     setSurfaceType(QWindow::OpenGLSurface);  
  15. }  
  16.   
  17. TriangleWindow::~TriangleWindow()  
  18. {  
  19.     delete m_device;  
  20. }  
  21.   
  22. void TriangleWindow::render(QPainter *painter)  
  23. {  
  24.     Q_UNUSED(painter);  
  25. }  
  26.   
  27. void TriangleWindow::render()  
  28. {  
  29.     if (!m_device)  
  30.         m_device = new QOpenGLPaintDevice;  
  31.   
  32.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);  
  33.   
  34.     m_device->setSize(size());  
  35.   
  36.     QPainter painter(m_device);  
  37.     render(&painter);  
  38. }  
  39.   
  40. void TriangleWindow::initialize()  
  41. {  
  42.     glClearColor(1, 0, 0, 1);  
  43. }  
  44.   
  45. void TriangleWindow::renderNow()  
  46. {  
  47.     if (!isExposed())  
  48.         return;  
  49.   
  50.     m_update_pending = false;  
  51.   
  52.     bool needsInitialize = false;  
  53.   
  54.     if (!m_context) {  
  55.         m_context = new QOpenGLContext(this);  
  56.         m_context->setFormat(requestedFormat());  
  57.         m_context->create();  
  58.   
  59.         needsInitialize = true;  
  60.     }  
  61.   
  62.     m_context->makeCurrent(this);  
  63.   
  64.     if (needsInitialize) {  
  65.         initializeOpenGLFunctions();  
  66.         initialize();  
  67.     }  
  68.   
  69.     render();  
  70.   
  71.     m_context->swapBuffers(this);  
  72. }  
  73.   
  74. void TriangleWindow::exposeEvent(QExposeEvent *event)  
  75. {  
  76.     Q_UNUSED(event);  
  77.   
  78.     if (isExposed())  
  79.         renderNow();  
  80. }  
  81.   
  82. void TriangleWindow::resizeEvent(QResizeEvent *event)  
  83. {  
  84.     Q_UNUSED(event);  
  85.   
  86.     if (isExposed())  
  87.         renderNow();  
  88. }  

main方法:
  1. #include "trianglewindow.h"  
  2.   
  3. #include <QGuiApplication>  
  4.   
  5. int main(int argc, char **argv)  
  6. {  
  7.     QGuiApplication app(argc, argv);  
  8.   
  9.     QSurfaceFormat format;  
  10.     format.setSamples(4);  
  11.   
  12.     TriangleWindow window;  
  13.     window.setFormat(format);  
  14.     window.resize(640, 480);  
  15.     window.show();  
  16.   
  17.     return app.exec();  
  18. }  

另一種寫法:
  1. #ifndef TRIANGLEWINDOW_H  
  2. #define TRIANGLEWINDOW_H  
  3.   
  4. #include <QWindow>  
  5.   
  6. class QOpenGLContext;  
  7.   
  8. class Renderer : public QObject  
  9. {  
  10.     Q_OBJECT  
  11. public:  
  12.     explicit Renderer(const QSurfaceFormat &format, Renderer *share = 0, QScreen *screen = 0);  
  13.     QSurfaceFormat format() const { return m_format; }  
  14.   
  15. public slots:  
  16.     void render(QSurface *surface, const QColor &color, const QSize &viewSize);  
  17.   
  18. private:  
  19.     void initialize();  
  20.   
  21.     bool m_initialized;  
  22.     QSurfaceFormat m_format;  
  23.     QOpenGLContext *m_context;  
  24. };  
  25.   
  26. class TriangleWindow : public QWindow  
  27. {  
  28.     Q_OBJECT  
  29. public:  
  30.     explicit TriangleWindow(const QSharedPointer<Renderer> &renderer);  
  31.       
  32. signals:  
  33.     void needRender(QSurface *surface, const QColor &color, const QSize &viewSize);  
  34.   
  35. private slots:  
  36.     void render();  
  37.   
  38. protected:  
  39.     void exposeEvent(QExposeEvent *);  
  40.   
  41. private:  
  42.     const QSharedPointer<Renderer> m_renderer;  
  43. };  
  44.   
  45. #endif // TRIANGLEWINDOW_H  

實現(xiàn)文件:
  1. #include "trianglewindow.h"  
  2.   
  3. #include <QOpenGLContext>  
  4.   
  5. Renderer::Renderer(const QSurfaceFormat &format, Renderer *share, QScreen *screen)  
  6.     : m_initialized(false)  
  7.     , m_format(format)  
  8. {  
  9.     m_context = new QOpenGLContext(this);  
  10.     if (screen)  
  11.         m_context->setScreen(screen);  
  12.     m_context->setFormat(format);  
  13.     if (share)  
  14.         m_context->setShareContext(share->m_context);  
  15.     m_context->create();  
  16. }  
  17.   
  18. TriangleWindow::TriangleWindow(const QSharedPointer<Renderer> &renderer)  
  19.     : m_renderer(renderer)  
  20. {  
  21.     setSurfaceType(QWindow::OpenGLSurface);  
  22.     setFlags(Qt::Window | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);  
  23.   
  24.     setGeometry(QRect(10, 10, 640, 480));  
  25.   
  26.     setFormat(renderer->format());  
  27.   
  28.     create();  
  29.   
  30.     connect(this, SIGNAL(needRender(QSurface *, const QColor &, const QSize &)),  
  31.             renderer.data(), SLOT(render(QSurface *, const QColor &, const QSize &)));  
  32.   
  33. }  
  34.   
  35. void TriangleWindow::exposeEvent(QExposeEvent *)  
  36. {  
  37.     render();  
  38. }  
  39.   
  40. void TriangleWindow::render()  
  41. {  
  42.     if (isExposed())  
  43.         emit needRender(this, QColor(255, 0, 0), size());  
  44. }  
  45.   
  46. void Renderer::render(QSurface *surface, const QColor &color, const QSize &viewSize)  
  47. {  
  48.     if (!m_context->makeCurrent(surface))  
  49.         return;  
  50.   
  51.     if (!m_initialized) {  
  52.         initialize();  
  53.         m_initialized = true;  
  54.     }  
  55.   
  56.     glViewport(0, 0, viewSize.width(), viewSize.height());  
  57.   
  58.     glClearColor(color.redF(), color.greenF(), color.blueF(), color.alphaF());  
  59.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  60.   
  61.     m_context->swapBuffers(surface);  
  62.   
  63. }  
  64.   
  65. void Renderer::initialize()  
  66. {  
  67.     glClearColor(0.1f, 0.1f, 0.2f, 1.0f);  
  68. }  

main方法:
  1. #include "trianglewindow.h"  
  2.   
  3. #include <QGuiApplication>  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QGuiApplication app(argc, argv);  
  8.   
  9.     QSurfaceFormat format;  
  10.     format.setDepthBufferSize(16);  
  11.     format.setSamples(4);  
  12.   
  13.     QSharedPointer<Renderer> renderer(new Renderer(format));  
  14.     TriangleWindow *window = new TriangleWindow(renderer);  
  15.     window->resize(640, 480);  
  16.     window->setVisible(true);  
  17.   
  18.     return app.exec();  
  19. }  

在Qt5,推薦使用QOpenGL*系列的類。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    色偷偷偷拍视频在线观看| 五月天综合网五月天综合网| 欧美日韩亚洲精品内裤| 三级理论午夜福利在线看| 国产一区二区三中文字幕| 在线欧洲免费无线码二区免费| 亚洲一区二区久久观看| 成人精品一区二区三区综合| 日韩人妻一区中文字幕| 少妇熟女亚洲色图av天堂| 亚洲欧美中文字幕精品| 国产精品香蕉一级免费| 亚洲欧美日韩在线看片| 最好看的人妻中文字幕| 日韩一区二区三区观看| 久热人妻中文字幕一区二区| 国产小青蛙全集免费看| 中国少妇精品偷拍视频 | 国产午夜精品亚洲精品国产| 亚洲熟女一区二区三四区| 中文字幕亚洲人妻在线视频 | 91人妻人人澡人人人人精品| 男生和女生哪个更好色| 国产偷拍盗摄一区二区| 大香蕉精品视频一区二区| 69精品一区二区蜜桃视频| 欧美日韩综合综合久久久| 日韩一区二区三区观看| 老鸭窝精彩从这里蔓延| 日韩性生活片免费观看| 成在线人免费视频一区二区| 麻豆果冻传媒一二三区| 中文字幕乱码亚洲三区| 免费观看一级欧美大片| 日本东京热加勒比一区二区| 隔壁的日本人妻中文字幕版 | 久久精品久久精品中文字幕| 久久精品a毛片看国产成人| 午夜视频成人在线免费| 欧美日韩综合在线第一页| 日韩黄色大片免费在线|