Qt使用一系列OpenGL功能来实现其2D绘图,包括自定义着色器和各种帧缓冲区。它将OpenGL置于一个相当混乱的状态。
beginNativePainting
/endNativePainting
是否允许Qt的绘图引擎保存此上下文并在用户完成绘制后检索它。
如果让xxxNativePainting
方法做相反的事情(即自动保存并恢复OpenGL的用户配置)本来是很不错的,但由于Qt允许直接调用OpenGL原语,所以在没有大量代码的情况下保存全局状态几乎是不可能的并可能造成严重的性能下降但是,这些方法只是简单的保存Qt的内部OpenGL状态,而不是让用户代码在一个毫无意义的配置中启动(而且很可能随着每个新的Qt版本而改变),将OpenGL重置为“中立”状态。
这意味着,一开始/结束段里面,你会改过自新:无着色器链接,没有顶点数组,最具全球性的参数复位等
相反,一个简单的QGLWidget
/PaintGL
场景您可以一劳永逸地设置全局OpenGL状态,并且只需在每帧调用渲染原语,在调用beginNativePainting
(链接/绑定着色器,设置全局参数,选择并启用各种缓冲器等)。
这也意味着你应该使用原生绘画陪练。让每个单独的小部件做自定义绘画可能会很快使您的渲染瘫痪。
我看到了这个例子,但是没有使用它的程序(在qt examples/demos/nokia-forum中)...并且我想知道它是否真的有用,或者有其他方法可以这样做。 2.如果我打算将它用于应用程序中的很多小部件,我可以将beginNativePainting()放在QWidget的ctor和第dtor端的endNativePainting()中? .....当我有很多小部件时它真的有用吗? – dan 2011-04-12 11:31:18
Qt框架提供了一个QPainter作为QWidget的paintEvent()方法的参数。使用begin/endNativePainting()只在该方法内部有意义(只要QPainter存在)。所以你不能简单地在ctor中调用beginNativePainting()(在什么上?)如果你不确定你在做什么,我建议只使用QPainter来绘制并忽略begin/endNativePainting()。只有当你遇到一些你无法用Qt API解决的问题时,那可能是需要重新考虑的问题了。 (如果你以后只是使用OpenGL,你可能想看看Qt的图形系统。) – Steffen 2011-04-12 12:38:12
我必须使用opengl来提高性能....我想知道什么是最好的方法在不改变我的小部件代码中的许多部件的情况下做到这一点。 – dan 2011-04-12 12:51:01