小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

在Qt5.4中如何實(shí)現(xiàn)QOpenGLWidget和QPainter混合編程

 勤奮不止 2019-06-25

在Qt5.4的Example中,有一個例子qopenglwidget,介紹了QOpenGLWidget和QPainter,但是在使用過程中,需要注意哪些方面呢?我在最初使用的時候就遇到兩者不能同時使用的問題,經(jīng)過一番折騰,終于解決了該問題。下面,我將需要注意的點(diǎn)記錄下來,以便查詢。

第一種方法,也就是直接QOpenGLWidget的paintGL函數(shù)中繪制兩者,其步驟為:

void GLWidget::paintGL() {

QPainter painter;
    painter.begin(this);
painter.beginNativePainting();

//繪制3D內(nèi)容

......

//注意:1、一定要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等;2、如果開啟深度測試,一定要關(guān)閉。例如:

m_program->release();
    m_vao.release();
    m_logoVbo.release();
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);

painter.endNativePainting();

//繪制2D內(nèi)容

......

painter.end();

}

第二種方法,是在網(wǎng)上找的,其貼子地址http://blog.csdn.net/sdaujiaojiao/article/details/41898207,該貼主應(yīng)該無法使用第一種方法,所以,另辟蹊徑?,F(xiàn)將方法也列出來,便于杳找,如若想詳細(xì)了解,請到上面的網(wǎng)址。其步驟為:首先,重載兩個函數(shù)paintGL、paintEvent;然后,就是實(shí)現(xiàn),但是這種方法需要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等,也不需要關(guān)閉深度測試。

void GLWidget::paintGL()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

......

}

void GLWidget::paintEvent(QPaintEvent *e) 

{

makeCurrent();
    paintGL();
    QPainter pter(this);
    pter.setPen(Qt::blue);
    pter.drawText(20,50,"This is a Text!");
    pter.end();
    update();

}

在第二種方法中,paintGL和paintEvent的調(diào)用是一一對應(yīng)的;起初,我還以為paintGL每次更新,會被調(diào)用兩次,經(jīng)過測試,其只被paintEvent函數(shù)調(diào)用一次。

兩種方法都有其優(yōu)點(diǎn),在根據(jù)需要選擇;第二種方法,比較適合擴(kuò)展,無需改動原因的代碼,只需要重載paintEvent,并在函數(shù)中調(diào)用paintGL,并繪制2D內(nèi)容即可。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多