【发布时间】:2017-10-13 15:07:48
【问题描述】:
在嵌入式系统上,由于非常具体的硬件/软件限制,我们需要另一个程序能够通过帧缓冲区 (/dev/fb0) 显示信息,同时保持我们的 Qt5/QML 程序在后台运行。 第二个程序运行时,我们在 QML 中显示了一个自定义 QQuickItem 派生的黑色矩形(在 update() 中只有一个“返回”),但我们仍然看到 LCD 显示屏上闪烁。
我们推测 QT 仍在将 Screen Graph(可能是位于矩形下方的其他项目)绘制到 /dev/fb0,从而导致两个程序同时写入 /dev/fb0 时出现闪烁。
我们不能使用第二种帧缓冲方法 (/dev/fb1),因为合成会显着增加处理器负载,从而使系统变得不可用。
一种想法是遍历屏幕图树,将所有节点的“ItemHasContents”标志标记为 false,因此屏幕图形渲染器不会写入 FB,然后在辅助程序完成其任务时重新启用。
另一个想法是通过顶级 QWindow 关闭渲染,但文档中没有任何内容说这甚至是可能的...... 这可以通过 QT 实现,还是通过 shell 脚本实现?
【问题讨论】:
-
你试过在顶级QWindow上调用
setVisible(false)吗? -
也许值得研究从 UI 线程进行长时间阻塞函数调用是否会阻止应用程序写入帧缓冲区。在超时和继续之前,使用 select() 来阻止观看 stdin 所需的毫秒数。对不起,我无法尝试,我没有使用 qt 直接连接到 fb 的设备
-
或者让第二个进程使用
kill -STOP和kill -CONT暂停Qt 应用程序。不过,如果 Qt 应用程序是通过 IO 访问的一半,这听起来有点危险。显然,如果 Qt 应用程序需要在此时间间隔内保持任何实时活动,那么这些都不可接受 -
是否可以使用 setRenderTarget() 暂时让 Qt 应用程序写入屏幕外帧缓冲区
标签: linux qt embedded qml framebuffer