Home · All Classes · Modules  · QSS HELP  · QSS 案例 · VER007 HOME

QGLWidget Class Reference
[QtOpenGL module]

该的QGLWidget类是一个小部件的绘制OpenGL图形。More...

继承QWidget

Methods

Static Methods


Detailed Description

该的QGLWidget类是一个小部件的绘制OpenGL图形。

的QGLWidget提供的功能显示集成到Qt应用OpenGL图形。它使用起来非常简单。你从它继承并使用子像任何其他QWidget,但你必须使用之间的选择QPainter和标准的OpenGL渲染命令。

QGLWidget的规定,你可以在你的子类重新实现来执行典型任务的OpenGL三种简便的虚函数:

下面是一个如何的QGLWidget子类可能看起来粗线条:

 class MyGLDrawer : public QGLWidget
 {
     Q_OBJECT        // must include this if you use Qt signals/slots

 public:
     MyGLDrawer(QWidget *parent)
         : QGLWidget(parent) {}

 protected:

     void initializeGL()
     {
         // Set up the rendering context, define display lists etc.:
         ...
         glClearColor(0.0, 0.0, 0.0, 0.0);
         glEnable(GL_DEPTH_TEST);
         ...
     }

     void resizeGL(int w, int h)
     {
         // setup viewport, projection etc.:
         glViewport(0, 0, (GLint)w, (GLint)h);
         ...
         glFrustum(...);
         ...
     }

     void paintGL()
     {
         // draw the scene:
         ...
         glRotatef(...);
         glMaterialfv(...);
         glBegin(GL_QUADS);
         glVertex3f(...);
         glVertex3f(...);
         ...
         glEnd();
         ...
     }

 };

如果你需要从触发比其他地方重绘paintGL( )(一个典型的例子,当使用的是timers动画场景) ,你应该调用widget的updateGL()函数。

Widget的OpenGL渲染上下文是由电流时paintGL( )resizeGL() ,或initializeGL()被调用。如果你需要从其他地方(例如,在你的widget的构造函数或在自己的油漆函数)调用标准的OpenGL API函数,你必须调用makeCurrent( )第一。

的QGLWidget提供用于请求新显示器format你也可以创建小部件定制渲染contexts

你也可以分享OpenGL显示列表的QGLWidget对象之间(见的QGLWidget构造的细节的文档)。

请注意,Windows ,下QGLContext属于的QGLWidget有当的QGLWidget被重设父重新创建。这是由于在Windows平台上的局限性必要的。这很可能会导致问题的那些子类,并安装自己的用户QGLContext上的QGLWidget 。它可以解决此问题通过把QGLWidget的一个虚拟部件内,然后重定父级的虚拟窗口小部件,而不是QGLWidget的。这将侧步完全的问题,这也是我们建议对于需要这类功能的用户。

在Mac OS X中,当Qt的是建立与可可的支持,一个的QGLWidget不能放在ontop的本身任何同级部件。这是由于可可API中的限制和不支持的苹果。

Overlays

如果复盖层由底层系统所支持的的QGLWidget创建在除了正常的上下文中的GL复盖范围内。

如果你想使用背景画面,您在指定它format。 (注:复盖必须传递给构造函数的QGLWidget的格式要求。 )你的GL小工具还应该实现一些虚拟方法或全部:

这些方法中以相同的方式工作,因为正常paintGL( )等函数,不同之处在于,当复盖范围内由目前他们将被调用。你可以明确地使复盖范围内的电流通过makeOverlayCurrent( ) ,你可以直接通过调用访问复盖范围内(例如,要求其透明色)overlayContext( ) 。

X服务器上,其中缺省视觉是在复盖面,非GL Qt的窗也可以用于复盖层。

Painting Techniques

如上所述,子类的QGLWidget来呈现以下列方式纯三维内容:

它也可以绘制2D图形到的QGLWidget子类中,有必要重新实现QGLWidget.paintEvent( )并执行以下操作:

对3D内容的顶部Overpainting 2D内容需要一点更多的努力。一种方法来执行此操作示于Overpainting例子。

Threading

由于Qt的4.8版本,这样做螺纹GL渲染的支持进行了改进。有迹象表明,我们目前支持三种情况:

因为这样做线程渲染时一般规则:注意,绑定和在不同的线程释放上下文必须由用户进行同步。一个GL渲染上下文只能是当前一个线程在任何时候。如果您尝试打开一个QPainter上的QGLWidget和窗口小部件的渲染上下文是当前在另一个线程,它会失败。

需要注意的是X11下,有必要设置Qt.AA_X11InitThreads应用程序的属性,使X11的库和GLX调用线程安全的,否则上述情况将会失败。

除了这一点,使用一个单独的线程原料GL调用呈现支持。

OpenGL is a trademark of Silicon Graphics, Inc. in the United States and other countries.


Method Documentation

QGLWidget.__init__ (self, QWidget parent = None, QGLWidget shareWidget = None, Qt.WindowFlags flags = 0)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个OpenGL窗口小部件与parent小工具。

default format被使用。窗口小部件会invalid如果系统中没有OpenGL support

parent和widget标志,f,参数被传递到QWidget构造函数。

If shareWidget是一个有效的QGLWidget,这个widget会分享OpenGL的显示列表和纹理与对象shareWidget。但是,如果shareWidget而这个小工具有不同的formats,共享可能是不可能的。您可以检查共享是否有效通过调用isSharing( ) 。

OpenGL的渲染状态等的初始化应通过重写来完成的initializeGL()函数,而不是在你的构造QGLWidget子类。

See also QGLFormat.defaultFormat()和Textures Example

QGLWidget.__init__ (self, QGLContext context, QWidget parent = None, QGLWidget shareWidget = None, Qt.WindowFlags flags = 0)

context说法有它的所有权转移给Qt的。

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个OpenGL窗口小部件与父parent

context参数是一个指向QGLContext你希望绑定到这个小工具。这使您可以通过在自己的QGLContext子类。

窗口小部件会invalid如果系统中没有OpenGL support

parent和widget标志,f,参数被传递到QWidget构造函数。

If shareWidget是一个有效的QGLWidget,这个widget会分享OpenGL的显示列表和纹理与对象shareWidget。但是,如果shareWidget而这个小工具有不同的formats,共享可能是不可能的。您可以检查共享是否有效通过调用isSharing( ) 。

OpenGL的渲染状态等的初始化应通过重写来完成的initializeGL()函数,而不是在你的构造QGLWidget子类。

See also QGLFormat.defaultFormat()和isValid( ) 。

QGLWidget.__init__ (self, QGLFormat format, QWidget parent = None, QGLWidget shareWidget = None, Qt.WindowFlags flags = 0)

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

构造一个OpenGL窗口小部件与父parent

format参数指定所需rendering options。如果底层的OpenGL / Window系统不能满足所有要求的功能format,的特征最接近的子集将被使用。创建后,format( )方法将返回所得到的实际格式。

窗口小部件会invalid如果系统中没有OpenGL support

parent和widget标志,f,参数被传递到QWidget构造函数。

If shareWidget是一个有效的QGLWidget,这个widget会分享OpenGL的显示列表和纹理与对象shareWidget。但是,如果shareWidget而这个小工具有不同的formats,共享可能是不可能的。您可以检查共享是否有效通过调用isSharing( ) 。

OpenGL的渲染状态等的初始化应通过重写来完成的initializeGL()函数,而不是在你的构造QGLWidget子类。

See also QGLFormat.defaultFormat()和isValid( ) 。

bool QGLWidget.autoBufferSwap (self)

返回True如果部件是做自动GL缓冲交换,否则返回False 。

See also setAutoBufferSwap( ) 。

int QGLWidget.bindTexture (self, QImage image, int target = GL_TEXTURE_2D, int format = GL_RGBA)

调用QGLContext : bindTexture (imagetargetformat)对当前设置环境。

See also deleteTexture( ) 。

int QGLWidget.bindTexture (self, QPixmap pixmap, int target = GL_TEXTURE_2D, int format = GL_RGBA)

调用QGLContext : bindTexture (pixmaptargetformat)对当前设置环境。

See also deleteTexture( ) 。

int QGLWidget.bindTexture (self, QString fileName)

这是一个重载函数。

绑定options是一组用来决定如何将纹理绑定到上下文选项。

此功能被引入Qt的4.6 。

int QGLWidget.bindTexture (self, QImage image, int target, int format, QGLContext.BindOptions options)

这是一个重载函数。

生成和二维GL纹理绑定到当前上下文的基础上,pixmap。所生成的纹理ID被返回,并且可以在使用

绑定options是一组用来决定如何将纹理绑定到上下文选项。

此功能被引入Qt的4.6 。

int QGLWidget.bindTexture (self, QPixmap pixmap, int target, int format, QGLContext.BindOptions options)

这是一个重载函数。

调用QGLContext.bindTexture (fileName)对当前设置环境。

See also deleteTexture( ) 。

QGLColormap QGLWidget.colormap (self)

返回色图这个小工具。

通常它是一个可以安装不同的色彩映射表只有顶层窗口部件。要求的子插件的颜色表将返回颜色映射为孩子的顶级窗口部件。

如果没有颜色表已设置这个小工具的QGLColormap返回的将是空的。

See also setColormap()和QGLColormap.isEmpty( ) 。

QGLContext QGLWidget.context (self)

返回这个窗口部件的背景下。

这是可能的情况下是无效的(参见isValid()) ,例如,如果底层的硬件不支持所请求的格式属性。

QImage QGLWidget.convertToGLFormat (QImage img)

将图像转换img到预期的OpenGL函数,如glTexImage2D ( )的未命名格式。返回的图像是不能用作QImage,但QImage.width( )QImage.height()和QImage.bits( )可用于与OpenGL的。使用的GL格式GL_RGBA

QGLWidget.deleteTexture (self, int tx_id)

调用QGLContext.deleteTexture (id)对当前设置环境。

See also bindTexture( ) 。

QGLWidget.doneCurrent (self)

不作任何GL上下文的当前上下文。通常情况下,你不需要调用此函数;QGLContext调用它是必要的。然而,也可能是在多线程环境中是有用的。

bool QGLWidget.doubleBuffer (self)

返回True如果包含的GL渲染上下文具有双缓冲,否则返回False 。

See also QGLFormat.doubleBuffer( ) 。

QGLWidget.drawTexture (self, QRectF target, int textureId, int textureTarget = GL_TEXTURE_2D)

调用相应的QGLContext.drawTexture( )与targettextureIdtextureTarget这个小工具的上下文。

此功能被引入Qt的4.4 。

QGLWidget.drawTexture (self, QPointF point, int textureId, int textureTarget = GL_TEXTURE_2D)

调用相应的QGLContext.drawTexture( )与pointtextureIdtextureTarget这个小工具的上下文。

此功能被引入Qt的4.4 。

bool QGLWidget.event (self, QEvent)

从重新实现QObject.event( ) 。

int QGLWidget.fontDisplayListBase (self, QFont font, int listBase = 2000)

QGLFormat QGLWidget.format (self)

返回所包含GL渲染上下文的格式。

See also setFormat( ) 。

QGLWidget.glDraw (self)

执行虚拟函数paintGL( ) 。

窗口小部件的渲染上下文将成为当前上下文和initializeGL() ,如果它尚未被称为将被调用。

QGLWidget.glInit (self)

OpenGL的初始化这个小工具的上下文。调用虚函数initializeGL( ) 。

QImage QGLWidget.grabFrameBuffer (self, bool withAlpha = False)

返回帧缓冲器的图像。如果withAlpha是真正的alpha通道被包括在内。

根据您的硬件,就可以明确选择调用此函数之前用glReadBuffer ( )调用抢的颜色缓冲区。

QGLWidget.initializeGL (self)

在第一次调用之前,这个虚函数被调用一次paintGL()或resizeGL() ,然后一旦每当插件已被分配一个新QGLContext。重新实现它的一个子类。

这个功能应该设置任何所需的OpenGL上下文渲染标志,定义显示列表等。

有不需要调用makeCurrent( ),因为这已经完成时,此函数被调用。

QGLWidget.initializeOverlayGL (self)

这个虚拟函数用于以相同的方式作为initializeGL()不同的是它运行在widget的复盖范围内,而不是widget的主要方面。这意味着, initializeOverlayGL ()的第一次调用之前被调用一次paintOverlayGL()或resizeOverlayGL( ) 。重新实现它的一个子类。

这个功能应该设置任何所需的OpenGL上下文渲染标志,定义显示列表等的复盖范围内。

有不需要调用makeOverlayCurrent( ),因为这已经完成时,此函数被调用。

bool QGLWidget.isSharing (self)

返回True如果这个小工具的GL上下文与另一GL上下文共享,否则返回假。上下文共享可能不是可能的,如果小窗口使用不同的格式。

See also format( ) 。

bool QGLWidget.isValid (self)

返回True如果部件有一个有效的GL渲染上下文,否则返回False 。一个widget将是无效的,如果系统没有OpenGL support

QGLWidget.makeCurrent (self)

使得这个小工具的当前部件的OpenGL操作,即让widget的渲染上下文当前的OpenGL渲染上下文。

QGLWidget.makeOverlayCurrent (self)

使得这个小部件电流的复盖范围内。如果你需要发出OpenGL命令来复盖上下文之外使用此initializeOverlayGL( )resizeOverlayGL()和paintOverlayGL( ) 。

什么都不做,如果这个部件有没有重叠。

See also makeCurrent( ) 。

QGLContext QGLWidget.overlayContext (self)

返回这个窗口部件,或者0的复盖范围内,如果该部件有没有重叠。

See also context( ) 。

QPaintEngine QGLWidget.paintEngine (self)

QGLWidget.paintEvent (self, QPaintEvent)

从重新实现QWidget.paintEvent( ) 。

在处理传入的paint事件event参数。会导致虚拟paintGL( )函数被调用。

窗口小部件的渲染上下文将成为当前上下文和initializeGL() ,如果它尚未被称为将被调用。

QGLWidget.paintGL (self)

这个虚函数被调用时的小部件需要被重画。重新实现它的一个子类。

有不需要调用makeCurrent( ),因为这已经完成时,此函数被调用。

QGLWidget.paintOverlayGL (self)

这个虚拟函数用于以相同的方式作为paintGL()不同的是它运行在widget的复盖范围内,而不是widget的主要方面。这意味着, paintOverlayGL ()被调用每当widget的复盖需要被重画。重新实现它的一个子类。

有不需要调用makeOverlayCurrent( ),因为这已经完成时,此函数被调用。

QGLWidget.qglClearColor (self, QColor c)

便利功能用于指定清算颜色的OpenGL。调用glClearColor (在RGBA模式)或glClearIndex (在颜色索引模式)的颜色c。适用于本部件GL上下文。

See also qglColor( )QGLContext.currentContext()和QColor

QGLWidget.qglColor (self, QColor c)

便利功能用于指定绘图颜色的OpenGL。调用glColor4 (在RGBA模式)或glIndex (在颜色索引模式)的颜色c。适用于本部件GL上下文。

Note:此功能不支持基于OpenGL / ES 2.0的系统。

See also qglClearColor( )QGLContext.currentContext()和QColor

QPixmap QGLWidget.renderPixmap (self, int width = 0, int height = 0, bool useContext = False)

呈现在一个像素映射当前场景,并返回像素图。

您可以在可见和不可见使用这种方法QGLWidget对象。

这个方法将创建一个像素图和临时QGLContext渲染的像素图。然后,它会调用initializeGL( )resizeGL()和paintGL( )在这种情况下。最后,小部件的原GL上下文恢复。

像素图的大小将w像素宽和h像素高,除非这些参数中的一个为0 (缺省值) ,在这种情况下,像素映像将具有相同尺寸的窗口小部件。

If useContext诚然,这个方法会尝试使用现有的GL上下文来渲染像素图更有效率。默认值为False 。仅使用真实的,如果你理解了风险。注意,在Windows下的临时上下文必须创建和使用useContext不支持参数。

复盖不会呈现到像素图。

如果GL渲染上下文和桌面有不同的位深度,其结果很可能会看起来令人惊讶。

请注意,创建显示列表中,视锥等的修改应该从内完成initializeGL( ) 。如果不这样做,则临时QGLContext将无法正确初始化,并且呈现像素图可能不完整/损坏。

QGLWidget.renderText (self, int x, int y, QString str, QFont font = QFont(), int listBase = 2000)

呈现的字符串str这个小部件的GL上下文。

xy在窗口坐标被指定,在该窗口的上部左角的原点。如果font没有被指定,当前设置的应用程序的字体将被用来呈现字符串。要改变呈现的文本的颜色,你可以使用glColor ( )调用(或qglColor( )便利功能) ,只是renderText ( )调用之前。

listBase参数已过时,将在Qt的未来版本中删除。

Note:此功能清除模板缓冲区。

Note:此功能不支持基于OpenGL / ES系统。

Note:此功能暂时禁用深度测试时绘制文本。

Note:此功能只能在内部使用QPainter.beginNativePainting()/QPainter.endNativePainting( )块,如果默认的OpenGL绘图引擎是QPaintEngine.OpenGL。为了使QPaintEngine.OpenGL默认的GL引擎,调用QGL.setPreferredPaintEngine (QPaintEngine.OpenGL)前QApplication构造函数。

OverpaintQPainter.drawText( )来代替。

QGLWidget.renderText (self, float x, float y, float z, QString str, QFont font = QFont(), int listBase = 2000)

这是一个重载函数。

xyz被指定的场景或物体坐标相对于当前设置的投影和模型矩阵。如果要标注模型与文本标籤,并在标籤移动的模式,因为它旋转等,这可能是有用的

Note:此功能不支持基于OpenGL / ES系统。

Note:如果深度测试启用此函数被调用之前,那么绘制的文本将深度测试对那些已经被绘制在场景中的模型。使用glDisable(GL_DEPTH_TEST)之前调用这个函数来注释的模型,而无需深度测试的文本。

OverpaintQPainter.drawText( )来代替。

QGLWidget.resizeEvent (self, QResizeEvent)

从重新实现QWidget.resizeEvent( ) 。

手柄调整所传递的事件event参数。调用虚函数resizeGL( ) 。

QGLWidget.resizeGL (self, int w, int h)

这个虚函数被调用时的小部件已调整大小。新的大小被传递widthheight。重新实现它的一个子类。

有不需要调用makeCurrent( ),因为这已经完成时,此函数被调用。

QGLWidget.resizeOverlayGL (self, int w, int h)

这个虚拟函数用于以相同的方式作为paintGL()不同的是它运行在widget的复盖范围内,而不是widget的主要方面。这意味着, resizeOverlayGL ()被调用时的小部件已调整大小。新的大小被传递widthheight。重新实现它的一个子类。

有不需要调用makeOverlayCurrent( ),因为这已经完成时,此函数被调用。

QGLWidget.setAutoBufferSwap (self, bool on)

If on是真正的自动GL缓冲交换被打开,否则将被关闭。

If on是真实和小部件是使用双缓冲格式,背景和前景GL缓冲区会自动在每个被交换paintGL( )调用。

缓冲区自动交换是默认。

See also autoBufferSwap( )doubleBuffer()和swapBuffers( ) 。

QGLWidget.setColormap (self, QGLColormap map)

设置颜色映射这个小工具到cmap。通常它是一种可以安装有色彩映射表仅顶层窗口小部件。

See also colormap( ) 。

QGLWidget.setContext (self, QGLContext context, QGLContext shareContext = None, bool deleteOldContext = True)

context说法有它的所有权转移给Qt的。

QGLWidget.setFormat (self, QGLFormat format)

QGLWidget.setMouseTracking (self, bool enable)

If enable是真的,那么鼠标跟踪被启用,否则将被禁用。

QGLWidget.swapBuffers (self)

掉期,一个离屏缓冲屏幕内容。这只是工作,如果widget的格式指定双缓冲模式。

通常情况下,没有必要显式调用这个函数,因为它是每个插件重绘后自动完成的,即每个时间后,paintGL( )已经执行。

See also doubleBuffer( )setAutoBufferSwap()和QGLFormat.setDoubleBuffer( ) 。

QGLWidget.updateGL (self)

这种方法也是一个Qt槽与C + +的签名void updateGL()

通过调用更新微件glDraw( ) 。

QGLWidget.updateOverlayGL (self)

这种方法也是一个Qt槽与C + +的签名void updateOverlayGL()

更新微件的叠加(如果有的话) 。会导致虚函数paintOverlayGL()被执行。

窗口小部件的渲染上下文将成为当前上下文和initializeGL() ,如果它尚未被称为将被调用。




PyQt 4.10.3 for X11 Copyright © Riverbank Computing Ltd and Nokia 2012 Qt 4.8.5