C++ 如何在没有X11或/dev/fb0的Linux中拍摄屏幕快照?

C++ 如何在没有X11或/dev/fb0的Linux中拍摄屏幕快照?,c++,linux,qt,embedded,directfb,C++,Linux,Qt,Embedded,Directfb,我在一个基于Linux的嵌入式系统上工作。它使用Qt进行窗口化,没有Xserver。我的目标是拍摄屏幕截图 我试过使用FBgrab。它失败了,因为我没有/dev/fb0,因为内核中没有启用帧缓冲区。我们正在运行一个基于Qt的应用程序,以在屏幕上显示UI(HDMI)。我还在QT网站上试用了屏幕截图应用程序,它使用QPixmap和抓取窗口。这也是一个失败,因为我无法在系统中运行两个QApplication,因为它会影响显示 是否有其他方法获取屏幕截图?您可以根据某个事件或命令使应用程序自行截图。您可

我在一个基于Linux的嵌入式系统上工作。它使用Qt进行窗口化,没有Xserver。我的目标是拍摄屏幕截图

我试过使用FBgrab。它失败了,因为我没有
/dev/fb0
,因为内核中没有启用帧缓冲区。我们正在运行一个基于Qt的应用程序,以在屏幕上显示UI(HDMI)。我还在QT网站上试用了屏幕截图应用程序,它使用QPixmap和抓取窗口。这也是一个失败,因为我无法在系统中运行两个QApplication,因为它会影响显示


是否有其他方法获取屏幕截图?

您可以根据某个事件或命令使应用程序自行截图。您可以通过将小部件抓取到一个pixmap,然后将这个pixmap保存到某个地方来实现这一点。例如:

QWidget *widget = QApplication::activeWindow();
QPixmap pixmap = QPixmap::grabWidget(widget);
pixmap.save(QString("/path/to/screenshot/screenshot.png"));

假设您的视频软件堆栈不是完全定制的,那么您的Linux视频驱动程序应该是FBDEV或DRI。要检查这一点,我会告诉您在live box中搜索/dev/fb0文件或/dev/dri/文件夹,但在嵌入式设备中,它们可以很容易地重命名为任何名称,因此唯一知道的方法是检查视频设备驱动程序源(如果它们是FBDEV,您将在drivers/video/中找到它们,如果它们是drivers,则在/drivers/gpu/drm中找到它们)


如果它们是FBDEV,那么/dev/fb0应该在那里,可能使用不同的名称。如果它们是DRI,在构建Linux内核时,您仍然可以启用DRM_FBDEV_仿真选项,并且有一个FBDEV设备节点,您可以使用FBgrab依赖它。

@nos在设备中,在/etc/directfbrc文件中,我们提供了一个备用图形系统(opengl),因此Qt不需要/dev/fb0感谢您的快速重播。我已经试过你说的了。代码是`#include int main(int argc,char**argv){QApplication app(argc,argv);QWidget*widget=QApplication::activeWindow();如果(widget==NULL){qWarning(),因为我在上面的注释中读到您正在使用GL,请使用QGLWidget::grabFrameBuffer()。我想从另一个应用程序拍摄屏幕截图。即主应用程序在屏幕上显示图像。我不想触摸此应用程序。我想从另一个应用程序将屏幕UI保存到一个文件中。可能吗?第二个应用程序不应在屏幕上绘制任何内容…您可能想使用QPixmap::grabWindow fro我是另一个应用程序,但我不能100%确定这是否适用于您的情况。我已经尝试过了。上面注释中的代码。我在这方面是否做错了什么。。