PyQT/Pyside Opengl 小部件覆盖
Posted
技术标签:
【中文标题】PyQT/Pyside Opengl 小部件覆盖【英文标题】:PyQT/Pyside Opengl widget overlay 【发布时间】:2018-06-20 19:15:30 【问题描述】:PyQT 或 Pyside 是否支持 OpenGL 按钮/通用小部件覆盖(我正在寻找类似于 FlashPrint 的此屏幕截图的内容?
我什至在谷歌上都遇到了麻烦,因为我不知道该怎么称呼它。在这里叠加是正确的术语吗?另外,如果 PyQT 或 Pyside 都不支持,那么是否有任何基于 Python 的 GUI 允许这样做?
【问题讨论】:
QOpenGlxxx 不支持上面没有小部件。 是否有任何基于 python 的 GUI 允许使用交互式覆盖进行渲染?我不依赖于 OpenGL(尽管坚持使用它会很好)。 看到这个:***.com/questions/19199863/… 感谢您的参考。希望是转向更高级的小部件(供参考austcadblog.files.wordpress.com/2013/11/fusion-360-1.png)。如果实现这一点变得过于复杂,我愿意找到 OpenGL 的替代方案。是否有任何基于 Python 的 GUI 本身支持此功能? 我不知道,我不知道。 【参考方案1】:我不知道这是否仍然是一个实际问题,但无论如何:
如果您使用QOpenGLWidget
(在较新的Qt 版本中推荐),您可以像通常使用QWidget
一样创建任何现有布局,并将您的自定义按钮添加到其中。这是(作为示例)它的样子:
如您所见,我在左侧的绿色QOpenGLWidget
顶部添加了一个继承自QWidget
的自定义且完全交互的栏。
另外值得一提的是,您可以指定 Qt 表面格式 以强制使用 OpenGl 窗口渲染,使用特定版本。此外,如果您想在应用程序中使用 OpenGL
,请添加属性 QApplication.setAttribute(Qt.AA_UseDesktopOpenGL)
以使用桌面 OpenGL。
【讨论】:
【参考方案2】:通常混合 OpenGL 渲染和 OS 渲染(用于按钮或其他控件)不是一个好主意。
一种解决方案是首先绘制控件(在内存中更好)并获取它的“屏幕截图”。然后进行OpenGL渲染。然后将图像传递给 OpenGL 并在之前的渲染之上渲染它。缺点是你失去了所有的控制反应,它们变成了图像。
另一种方式可能会更好。首先渲染OpenGL。然后获取该图像(例如glReadPixels
)。然后blit图像作为背景。然后绘制控件。
【讨论】:
计划是从小按钮开始,然后使用更高级的东西,比如这个 fusion 360 界面 (austcadblog.files.wordpress.com/2013/11/fusion-360-1.png)。当我说我想要一个覆盖时,我只是意味着我希望按钮像这两个示例一样位于 OpenGL 窗口的范围内。我列出的示例是否使用 OpenGL 以外的东西进行渲染,然后允许它们覆盖 GUI 元素?以上是关于PyQT/Pyside Opengl 小部件覆盖的主要内容,如果未能解决你的问题,请参考以下文章
Qt/PyQt4/PySide QDateEdit 日历弹窗掉屏
将 vtkOrientationMarkerWidget 与 QVTKRenderWindowInteractor 一起使用 [PyQt4/PySide]