问题标签 [qglwidget]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4213 浏览

qt - OpenGL 渲染到 QML 项目

我有一个 QML 文件,其中包含 QML 项目的布局,现在我希望这些项目之一是 QGLWidget。即我想渲染到特定的 QML 项目。

有谁知道如何做到这一点?

0 投票
2 回答
3228 浏览

multithreading - QGLWidget 的paintGL() 方法是从哪个Qt 线程调用的?

假设我使用 QGLWidget 的 paintGL() 方法使用 OpenGL 绘制到小部件中。Qt 调用paintGL() 方法后,会自动触发缓冲区交换。在 OpenGL 中,这种缓冲区交换通常会阻塞调用线程,直到帧渲染到后台缓冲区完成,对吧?我想知道哪个 Qt 线程调用了paintGL 以及缓冲区交换。它是主要的 Qt UI 线程吗?如果是,那是不是意味着缓冲区交换期间的阻塞也阻塞了整个 UI?我一般找不到有关此过程的任何信息..

谢谢

0 投票
2 回答
2324 浏览

c++ - 初始化后 QGLWidget 未收到对 resizeGL 的调用

我遇到的问题似乎与这个(未回答的)问题中提出的问题相同:Qt resizeGL 问题

我正在QGLWidget为更大的应用程序测试一个新的。该resizeGL方法被连接以更改glViewport和重新绘制 OpenGL 视图。我的 QGLWidget 不是布局的一部分,只是被创建,显示如下:

在我的电脑上,这默认创建一个 640x480 窗口并resizeGL在初始化时调用。每当我调整窗口大小时,resizeGL都不会被调用。

在我试图解决这个问题的过程中,我尝试创建一个单独QWidget的,QVBoxLayout它只包含CustomWidget. 这创建了一个非常小的窗口,所以我修复了我的sizeHintand sizePolicyfor CustomWidget,尽管这仍然对resizeGL调用没有影响。在这一点上,我不确定如何进行。

0 投票
1 回答
926 浏览

c++ - QDockWidget - QGlWidget - 当小部件从停靠栏中拖出时,可绘制无效

我的QDockWidget应用程序中有一个对象,其中包含一个QWidget对象。当我的应用程序运行时,一切似乎都很好。但是,当我将小部件从QDockWidget(从 Dock 小部件中拖出)移动时,我的控制台上突然收到了这 10 行警告消息:

我的主要功能如下:

我怎么解决这个问题?。
我在这里看到了一个类似的问题:QScrollArea 中的 QGLWidget 说 "invalid drawable",并且基于该帖子,我尝试删除setFixedSize()我的小部件中的所有函数并用函数替换它们setMinimumSize(),但这并没有解决问题。有没有类似的经历?。你是怎么解决的?

0 投票
1 回答
1974 浏览

qt - Qt - 在一个 3D 场景中包含 QGraphicsView 的多个图层(QGLWidget)

我目前正在评估实现可导航 3D 场景的可能性,该场景允许渲染多个 2D 图层。更准确地说,我想在 3D 环境中显示多个图形,以查明这些图形之间的相似性和差异。考虑以下屏幕截图,将有两个图形(一个黑色,一个灰色),它们是等效的 - 对于不同的图形,异常节点可能,即以红色突出显示。

3d 中的两个图形

我正在使用 Qt 的图形视图框架QGraphicsScene并使用和几个s建立了一个可编辑的图形编辑器QGraphicsItem,我将其与这个项目分开。

Qt 提供了OpenGL 支持,例如,QGLWidget我查看了提供的示例。鉴于我没有使用 OpenGL(尽管我使用 Java3D 进行了一些工作),如果有人可以分享他们的经验,我会很高兴。

我想到了几个解决方案:

  1. 将每个渲染QGraphicsView到 aQPixmap并以 3D 显示它们,这将使图形可导航,但会禁止选择任何元素等。
  2. 为每个 2D 图形元素创建一个等效的 3D 元素,并将每个元素“转换”QGraphicsView为 3D 表示。我想这将是一项相当大的工作(尤其是因为我没有使用 OpenGL)
  3. 也许有一种简单的方法可以“放置” QGraphicScenes、视图或只是 a 中的QGraphicsItemsQGLWidget而无需进行很多调整,并且仍然注册通常的“mouseclickevents”等。

对于第一个实现,在不同层显示多个图形的普通导航“查看器”就足够了。但我想保持它的可扩展性,以便将来添加,例如,挑选。

0 投票
2 回答
2651 浏览

qt - 如何全屏显示QGLWidget?

我有一个 QGLWidget 作为我的应用程序 UI 的一部分。它不是一个中央小部件,它周围还有很多其他小部件。我想在用户单击按钮时全屏显示。类似 youtube video flash player 的功能。

我尝试使用showFullScreen没有效果。

我已阅读how-to-fullscreen-a-qglwidgetfullscreen-widget,但他们建议使用 showFullScreen。

Qt 文档指出,使用 showFullScreen 小部件必须是一个独立的窗口。所以我认为应该有一些技巧。

0 投票
0 回答
2756 浏览

c++ - Qt QGLWidget OpenGL 从 swapBuffers() 上的线程块渲染

我从与主线程不同的线程将 OpenGL 渲染到 QGLWidget 时遇到一个奇怪的问题。

Qt Developers 有很多官方声明,“完全有可能”从不同的线程进行渲染。我遵循了以下解释:

http://doc.qt.nokia.com/qq/qq06-glimpsing.html#writingmultithreadedglapplications

我以几乎相同的方式实现它。唯一的区别是,我没有将 QWorkspace 与不同的 GLWidget 一起使用,而是我只是创建了一个以 GLWidget 作为中心小部件的 MainWindow。

当我启动应用程序时,渲染线程开始在随机位置渲染带有三角形的帧。一段时间后(有时 2 秒,有时 10 秒),线程开始在 swapBuffers() 调用上阻塞很长时间。有时 swapBuffers() 会在几秒钟后自发返回。当我将鼠标指针移到小部件或主窗口上时,swapBuffers 立即返回,只要我移动鼠标指针,swapBuffers() 就不会阻塞。将鼠标移出小部件或停止移动鼠标后,渲染会继续几秒钟,然后 swapBuffers 再次开始阻塞。

我对这种行为完全没有解释。我知道 swapBuffers() 会定期阻塞,直到一帧完成,而且我也很清楚,在 OpenGL 缓冲区交换调用期间也可能发生对 vsync 的等待。但这应该在几毫秒内发生,并且不会阻塞几秒钟。环境是带 GLX 的 X11。

有人知道这里发生了什么吗?我什至不知道如何找出问题所在..

是否有人尝试按照我上面链接的文档中的说明从不同的线程实现渲染?

0 投票
1 回答
1257 浏览

python - QWidget showFullScreen 产生多个 resizeEvents

我有一个使用 PySide 用 python 编写的 QT 应用程序,我偶然发现了一个关于 QGLWidget 的 showFullScreen 方法的小问题(尽管问题也发生在其他所有小部件上):

问题是,在程序从 showFullScreen 返回后,小部件没有其“最终”分辨率。开关似乎在 5 到 10 毫秒后异步触发。

这对我来说是个问题,因为我必须根据小部件显示后的大小进行一些布局计算。

下面是一个小复制器,它是 QGLWidget 的子类。使用这个复制器你会注意到,在 showFullScreen 之后 resizeEvent 将被调用两次。

我正在寻找一种方便的方式来知道哪个 resizeEvent 是“最终”的,或者一种知道小部件何时真正处于全屏模式的方式。有没有我可以连接的信号?

非常感谢您对此的任何帮助。

0 投票
1 回答
1417 浏览

c++ - 在使用 Qt 开发的媒体播放器中切换全屏

我目前正在使用 Qt 开发媒体播放器。所需的常见功能之一是能够切换全屏。

渲染画布本质上是一个 QGLWidget(我从它继承)。它被添加到作为该媒体播放器的主窗口的应用程序窗口中。除了渲染画布,应用程序窗口还有工具栏、状态栏和其他小部件。我要实现的全屏是让渲染画布占据全屏,而其他小部件不可见。同时,我仍然可以通过按键触发事件。

我尝试将渲染画布的父级重置为 0 并调用 showFullScreen() 函数。我在应用程序窗口上调用了 hide()。这使得画布占据了预期的整个屏幕。但是,应用程序没有抓取任何按键事件。结果,我无法恢复正常。另外,画布背景在黑白之间闪烁(默认背景为白色)。

无论如何,我不认为我尝试过的方式是实现这一点的最佳方式。因为当我恢复正常时会有一些复杂的重新养育。而且整个应用程序变得难以管理,因为在全屏时会执行一些任务,例如查看 piexl 值(源是原始的)。

有人可以建议一种更好的方法来实现全屏切换吗?

0 投票
3 回答
5530 浏览

opengl - 如何缩放 glDrawPixels?

我需要缩放 glDrawPixels 图像的结果。

我正在 Qt QGLWidget 中使用 glDrawPixels 绘制一个 640x480 像素的图像缓冲区。

我尝试在 PaintGL 中执行以下操作:

但它不起作用。

我将 OpenGL 视口和 glOrtho 设置为小部件的大小: