在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中如何實現QOpenGLWidget和QPainter混合程式設計
在Qt5.4的Example中,有一個例子qopenglwidget,介紹了QOpenGLWidget和QPainter,但是在使用過程中,需要注意哪些方面呢?我在最初使用的時候就遇到兩者不能同時使用
QOpenGLWindow 、QOpenGLWidget 和 QPainter混合渲染方法初探
該方法不存在普遍性。別按照此方法了 我用的是OpenGL 3.3 ,Qt 5.4.0 先說QWindow 和 QPainter 結合,這個Qt有現成的例子。就是 那個openglWindow那個例子。 這個基本直接照搬程式碼: .h #include <QSurf
QOPenGLWidget與QPainter混合程式設計--繪製文字
前言:QOPenGLWidget取代了之前的QGLWidget類,用以在Qt中提供Opengl的程式設計介面。在QGLWidget類中,我們可以通過方法drawTexture來繪製文字。但是在QOPenGLWidget類的時候,這個方法沒有提供了。官方文件
QML中實現setTimeout和setInterval
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開發中實現OC和Swift的混編
背景: 最近又開始看了一些關於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中實現IAP和Apple Pay支付的注意點
IAP開發需要的注意點在沙箱環境測試Store Kit在模擬器上無法執行,需要使用真機測試sanbox和app store內容一致,只是不執行真實的支付動作在測試的iphone上面退出itunes賬戶不能在測試的iphone手機上登入測試賬戶登入在程式中購買商品後,store
在python中實現生產者和消費者的例子(一):使用multiprocessing和pipe()
本文介紹如何用multiprocessing模組及pipe實現生產者和消費者的例子 程式碼例項如下: import multiprocessing #定義消費者 def consumer(pipe): output_p,input_p=pipe input
Matlab和C++混合程式設計——在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中的Forms和Windows混合驗證
摘要: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中實現utf8和gbk的互轉
#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