1. 程式人生 > >在Qt5.4中如何實現QOpenGLWidget和QPainter混合程式設計

在Qt5.4中如何實現QOpenGLWidget和QPainter混合程式設計

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

第一種方法,也就是直接QOpenGLWidget的paintGL函式中繪製兩者,其步驟為:

void GLWidget::paintGL() {

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

//繪製3D內容

......

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

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

painter.endNativePainting();

//繪製2D內容

......

painter.end();

}

第二種方法,是在網上找的,其貼子地址http://blog.csdn.net/sdaujiaojiao/article/details/41898207,該貼主應該無法使用第一種方法,所以,另闢蹊徑。現將方法也列出來,便於杳找,如若想詳細瞭解,請到上面的網址。其步驟為:首先,過載兩個函式paintGL、paintEvent;然後,就是實現,但是這種方法需要釋放QOpenGLVertexArrayObject、QOpenGLBuffer、QOpenGLShaderProgram、QOpenGLTexture等,也不需要關閉深度測試。

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的呼叫是一一對應的;起初,我還以為paintGL每次更新,會被呼叫兩次,經過測試,其只被paintEvent函式呼叫一次。

兩種方法都有其優點,在根據需要選擇;第二種方法,比較適合擴充套件,無需改動原因的程式碼,只需要過載paintEvent,並在函式中呼叫paintGL,並繪製2D內容即可。

相關推薦

Qt5.4如何實現QOpenGLWidgetQPainter混合程式設計

在Qt5.4的Example中,有一個例子qopenglwidget,介紹了QOpenGLWidget和QPainter,但是在使用過程中,需要注意哪些方面呢?我在最初使用的時候就遇到兩者不能同時使用

QOpenGLWindow 、QOpenGLWidget QPainter混合渲染方法初探

該方法不存在普遍性。別按照此方法了 我用的是OpenGL 3.3 ,Qt 5.4.0 先說QWindow 和 QPainter 結合,這個Qt有現成的例子。就是 那個openglWindow那個例子。 這個基本直接照搬程式碼: .h #include <QSurf

QOPenGLWidgetQPainter混合程式設計--繪製文字

前言:QOPenGLWidget取代了之前的QGLWidget類,用以在Qt中提供Opengl的程式設計介面。在QGLWidget類中,我們可以通過方法drawTexture來繪製文字。但是在QOPenGLWidget類的時候,這個方法沒有提供了。官方文件

QML實現setTimeoutsetInterval

comment del tint connect start pre 通過 false code Qt的QML中,js未提供setTimeout和setInterval,可以通過下面的代碼實現。 Timer {id: timer} function setTimeout

----如何在js實現公有私有屬性

私有方法其實和閉包是有關係的,私有方法在其他語言裡面是不被訪問到的,除非有專門的介面,js的區域性作用域裡面的東西在正常情況下也是不能被外部訪問到,但是通過閉包的方式可以訪問到,這樣我們就可以利用這個特性,看例子: var book = (function(){ var page =

iOS開發實現OCSwift的混編

背景: 最近又開始看了一些關於Swift的視訊、部落格、書,發現swift相對於OC使用起來更簡潔了,於是就想在原有專案中引入swift。原有的專案都是使用OC寫的,既然要在原有專案中引入swift檔案首先就要實現OC和swift的混編設定。 混編設定:

WebService之RPC的(Axis2、CXF、Jersey、Hessian)4實現方式

一、什麼是WebService Web service是一個平臺獨立的,低耦合的,自包含的、基於可程式設計的web的應用程式,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、釋出、發現、協調和配置這些應用程式,用於開發分散式的互操作的應用程式。 Web

JS實現字串陣列的相互轉化

        早上起來看了一道JS的面試題,是這樣描述的:利用var s1=prompt("請輸入任意的字串","")可以獲取使用者輸入 的字串,試程式設計將使用者輸入的字串“反轉”,並且將字串輸出

textview中點選效果實現,比如點選textview實現圖片文字的顏色變化(類似於button)

<TextView android:drawableTop="@drawable/bg_text_view" android:id="@+id/home_toolbar_settings" an

iOS實現IAPApple Pay支付的注意點

IAP開發需要的注意點在沙箱環境測試Store Kit在模擬器上無法執行,需要使用真機測試sanbox和app store內容一致,只是不執行真實的支付動作在測試的iphone上面退出itunes賬戶不能在測試的iphone手機上登入測試賬戶登入在程式中購買商品後,store

在python實現生產者消費者的例子(一):使用multiprocessingpipe()

本文介紹如何用multiprocessing模組及pipe實現生產者和消費者的例子 程式碼例項如下: import multiprocessing #定義消費者 def consumer(pipe):     output_p,input_p=pipe     input

MatlabC++混合程式設計——在matlab除錯過程可以跳入VS除錯觀察.cpp檔案的資料

1.在matlab中為.cpp使用mex編譯生成.mexw64(64位)檔案 在matlab中封裝編譯函式: compile_gc(debug_flag) compile_gc(debug_flag=1):生成兩種檔案,(.mexw64和.mexw64.pdb) compi

ASP.NET的FormsWindows混合驗證

摘要:ASP.NET開發人員曾經問到過如何使用Forms和Windows混合驗證。Paul Wilson提供了一個解決方案來獲得Windows使用者名稱,或者,將使用者轉向登入頁面。 簡介 我曾經遇到很多ASP.NET開發人員問到如何使用Forms和Windows混合

Qt5.4遇到找不到標頭檔案等。。

從新學習Qt時,重灌了Qt5.4,當執行Hello World例子時,遇到了下列的情況   <span style="font-size:18px;">#include <QApplication> #include <QDialog>

虛幻4實現簡單的raymarch

    以前一直都是在Directx或者UnityShaderLab裡做raymarch,最近在研究虛幻4的Shader所以在虛幻4裡簡單實現了一下這個。我的step數量調得很低。剛開始其實不好下手,虛幻的渲染架構過於複雜,高度封裝,我們無法直接像unityshaderlab

QOpenGLWidget + QPainter混合程式設計

本示例將一個二維陣列視覺化,且每一個數據點的顏色由它的Z值決定。根據http://blog.csdn.net/dp_huang/article/details/53816805 在呼叫opengl函式時,要使用glEnable(GL_DEPTH_TEST);而使用QPaint

c實現utf8gbk的互轉

#include <iconv.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include &

4. PyQt5-實現顯示業務邏輯分離

ini 圖片 顯示效果 com text rom qtgui 代碼 orm Author: Notus([email protected]) Create: 2019-02-10 Update: 2019-02-10 PyQt5 實現顯示和業務邏輯分離, 繼承主界面文件

css實現顯示隱藏

QQ:979111986/5730473 微信:ainusers 現就職:新浪 微博:AinUser 微信公眾號:AinUser 郵箱:[email protected] 程式設計技術交流群:540049350 github:g

在java網路程式設計實現伺服器客戶端一對一的聊天

如果有多個客戶端接入,都可以傳送訊息給伺服器,但伺服器只和最後一個客戶聊天。,如果要實現群聊的話,只要把所有的socket儲存到集合中,有客戶輸入時遍歷socket得到輸出流並把訊息廣播給各個客戶端就行了。 四個讀寫的執行緒類都是一樣的,可以進行封裝,這裡就不封裝了。 Se