QOpenGLWindowclass is a convenience subclass ofQWindow以履行 OpenGL 描绘。 更多 …
New in version 5.4.
def
context
()
def
defaultFramebufferObject
()
def
doneCurrent
()
def
grabFramebuffer
()
def
isValid
()
def
makeCurrent
()
def
shareContext
()
def
updateBehavior
()
def
initializeGL
()
def
paintGL
()
def
paintOverGL
()
def
paintUnderGL
()
def
resizeGL
(w, h)
def
frameSwapped
()
QOpenGLWindowis an enhancedQWindowthat allows easily creating windows that perform OpenGL rendering using an API that is compatible withQOpenGLWidgetand is similar to the legacyQGLWidget。不像QOpenGLWidget,QOpenGLWindowhas no dependency on the widgets module and offers better performance.A typical application will subclass
QOpenGLWindowand reimplement the following virtual functions:
initializeGL()to perform OpenGL resource initialization
resizeGL()to set up the transformation matrices and other window size dependent resourcesTo schedule a repaint, call the
update()function. Note that this will not immediately result in a call topaintGL()。调用update()multiple times in a row will not change the behavior in any way.This is a slot so it can be connected to a
timeout()signal to perform animation. Note however that in the modern OpenGL world it is a much better choice to rely on synchronization to the vertical refresh rate of the display. SeesetSwapInterval()on a description of the swap interval. With a swap interval of1, which is the case on most systems by default, theswapBuffers()call, that is executed internally byQOpenGLWindowafter each repaint, will block and wait for vsync. This means that whenever the swap is done, an update can be scheduled again by callingupdate(), without relying on timers.To request a specific configuration for the context, use
setFormat()like for any otherQWindow. This allows, among others, requesting a given OpenGL version and profile, or enabling depth and stencil buffers.不像
QWindow,QOpenGLWindowallows opening a painter on itself and performQPainter-based drawing.
QOpenGLWindowsupports multiple update behaviors. The default,NoPartialUpdateis equivalent to a regular, OpenGL-basedQWindowor the legacyQGLWidget. In contrast,PartialUpdateBlitandPartialUpdateBlendare more in line withQOpenGLWidget‘s way of working, where there is always an extra, dedicated framebuffer object present. These modes allow, by sacrificing some performance, redrawing only a smaller area on each paint and having the rest of the content preserved from of the previous frame. This is useful for applications than render incrementally usingQPainter, because this way they do not have to redraw the entire window content on eachpaintGL()调用。Similarly to
QOpenGLWidget,QOpenGLWindow支持AA_ShareOpenGLContextsattribute. When enabled, the OpenGL contexts of allQOpenGLWindowinstances will share with each other. This allows accessing each other’s shareable OpenGL resources.For more information on graphics in Qt, see 图形 .
QOpenGLWindow
(
shareContext
[
,
updateBehavior=NoPartialUpdate
[
,
parent=None
]
]
)
¶
QOpenGLWindow([updateBehavior=NoPartialUpdate[, parent=None]])
- param parent
- param shareContext
- param updateBehavior
UpdateBehavior
构造新
QOpenGLWindow
采用给定
parent
and
updateBehavior
。
QOpenGLWindow
‘s context will share with
shareContext
.
另请参阅
UpdateBehavior
shareContext
构造新
QOpenGLWindow
采用给定
parent
and
updateBehavior
.
另请参阅
UpdateBehavior
PySide2.QtGui.QOpenGLWindow.
UpdateBehavior
¶
This enum describes the update strategy of the
QOpenGLWindow
.
|
常量 |
描述 |
|---|---|
|
QOpenGLWindow.NoPartialUpdate |
Indicates that the entire window surface will redrawn on each update and so no additional framebuffers are needed. This is the setting used in most cases and is equivalent to how drawing directly via
|
|
QOpenGLWindow.PartialUpdateBlit |
Indicates that the drawing performed in
|
|
QOpenGLWindow.PartialUpdateBlend |
Similar to , but instead of using framebuffer blits, the contents of the extra framebuffer is rendered by drawing a textured quad with blending enabled. This, unlike , allows alpha blended content and works even when the glBlitFramebuffer is not available. Performance-wise this setting is likely to be somewhat slower than . |
PySide2.QtGui.QOpenGLWindow.
context
(
)
¶
返回
QOpenGLContext
used by this window or
0
若尚未初始化。
PySide2.QtGui.QOpenGLWindow.
defaultFramebufferObject
(
)
¶
GLuint
The framebuffer object handle used by this window.
When the update behavior is set to
NoPartialUpdate
, there is no separate framebuffer object. In this case the returned value is the ID of the default framebuffer.
Otherwise the value of the ID of the framebuffer object or
0
若尚未初始化。
PySide2.QtGui.QOpenGLWindow.
doneCurrent
(
)
¶
发行上下文。
It is not necessary to call this function in most cases, since the widget will make sure the context is bound and released properly when invoking
paintGL()
.
另请参阅
PySide2.QtGui.QOpenGLWindow.
frameSwapped
(
)
¶
PySide2.QtGui.QOpenGLWindow.
grabFramebuffer
(
)
¶
Returns a copy of the framebuffer.
注意
This is a potentially expensive operation because it relies on glReadPixels() to read back the pixels. This may be slow and can stall the GPU pipeline.
注意
When used together with update behavior
NoPartialUpdate
, the returned image may not contain the desired content when called after the front and back buffers have been swapped (unless preserved swap is enabled in the underlying windowing system interface). In this mode the function reads from the back buffer and the contents of that may not match the content on the screen (the front buffer). In this case the only place where this function can safely be used is
paintGL()
or
paintOverGL()
.
PySide2.QtGui.QOpenGLWindow.
initializeGL
(
)
¶
This virtual function is called once before the first call to
paintGL()
or
resizeGL()
. Reimplement it in a subclass.
This function should set up any required OpenGL resources and state.
There is no need to call
makeCurrent()
because this has already been done when this function is called. Note however that the framebuffer, in case partial update mode is used, is not yet available at this stage, so avoid issuing draw calls from here. Defer such calls to
paintGL()
代替。
另请参阅
PySide2.QtGui.QOpenGLWindow.
isValid
(
)
¶
bool
返回
true
if the window’s OpenGL resources, like the context, have been successfully initialized. Note that the return value is always
false
until the window becomes exposed (shown).
PySide2.QtGui.QOpenGLWindow.
makeCurrent
(
)
¶
Prepares for rendering OpenGL content for this window by making the corresponding context current and binding the framebuffer object, if there is one, in that context context.
It is not necessary to call this function in most cases, because it is called automatically before invoking
paintGL()
. It is provided nonetheless to support advanced, multi-threaded scenarios where a thread different than the GUI or main thread may want to update the surface or framebuffer contents. See
QOpenGLContext
for more information on threading related issues.
This function is suitable for calling also when the underlying platform window is already destroyed. This means that it is safe to call this function from a
QOpenGLWindow
subclass’ destructor. If there is no native window anymore, an offscreen surface is used instead. This ensures that OpenGL resource cleanup operations in the destructor will always work, as long as this function is called first.
PySide2.QtGui.QOpenGLWindow.
paintGL
(
)
¶
This virtual function is called whenever the window contents needs to be painted. Reimplement it in a subclass.
There is no need to call
makeCurrent()
because this has already been done when this function is called.
Before invoking this function, the context and the framebuffer, if there is one, are bound, and the viewport is set up by a call to glViewport(). No other state is set and no clearing or drawing is performed by the framework.
注意
When using a partial update behavior, like
PartialUpdateBlend
, the output of the previous call is preserved and, after the additional drawing perfomed in the current invocation of the function, the content is blitted or blended over the content drawn directly to the window in
paintUnderGL()
.
另请参阅
initializeGL()
resizeGL()
paintUnderGL()
paintOverGL()
UpdateBehavior
PySide2.QtGui.QOpenGLWindow.
paintOverGL
(
)
¶
This virtual function is called after each invocation of
paintGL()
.
When the update mode is set to
NoPartialUpdate
, there is no difference between this function and
paintGL()
, performing rendering in either of them leads to the same result.
像
paintUnderGL()
, rendering in this function targets the default framebuffer of the window, regardless of the update behavior. It gets called after
paintGL()
has returned and the blit (
PartialUpdateBlit
) or quad drawing (
PartialUpdateBlend
) has been done.
另请参阅
paintGL()
paintUnderGL()
UpdateBehavior
PySide2.QtGui.QOpenGLWindow.
paintUnderGL
(
)
¶
The virtual function is called before each invocation of
paintGL()
.
When the update mode is set to
NoPartialUpdate
, there is no difference between this function and
paintGL()
, performing rendering in either of them leads to the same result.
The difference becomes significant when using
PartialUpdateBlend
, where an extra framebuffer object is used. There,
paintGL()
targets this additional framebuffer object, which preserves its contents, while and
paintOverGL()
target the default framebuffer, i.e. directly the window surface, the contents of which is lost after each displayed frame.
注意
Avoid relying on this function when the update behavior is
PartialUpdateBlit
. This mode involves blitting the extra framebuffer used by
paintGL()
onto the default framebuffer after each invocation of
paintGL()
, thus overwriting all drawing generated in this function.
另请参阅
paintGL()
paintOverGL()
UpdateBehavior
PySide2.QtGui.QOpenGLWindow.
resizeGL
(
w
,
h
)
¶
w
–
int
h
–
int
This virtual function is called whenever the widget has been resized. Reimplement it in a subclass. The new size is passed in
w
and
h
.
注意
This is merely a convenience function in order to provide an API that is compatible with
QOpenGLWidget
. Unlike with
QOpenGLWidget
, derived classes are free to choose to override
resizeEvent()
instead of this function.
注意
Avoid issuing OpenGL commands from this function as there may not be a context current when it is invoked. If it cannot be avoided, call
makeCurrent()
.
注意
Scheduling updates from here is not necessary. The windowing systems will send expose events that trigger an update automatically.
另请参阅
返回
QOpenGLContext
requested to be shared with this window’s
QOpenGLContext
.
PySide2.QtGui.QOpenGLWindow.
updateBehavior
(
)
¶
Returns the update behavior for this
QOpenGLWindow
.