如何在无头模式下运行 Qt 应用程序(不显示我的 GUI)

Pat*_*RIA 3 c++ qt command-line qt5 qapplication

我有一个基于 a 的 QT 应用程序QApplication,假设我的应用程序有一个复杂的 GUI(QDialogQMainWindow...)。

我的应用程序可以以两种模式运行:

  • 带图形用户界面
  • 在无头模式下

我想知道如何在无头模式下启动应用程序(也就是说没有 GUI 可见)

从下面的非常基本的代码来看,我必须有什么论据才能允许这样做?

int main(int argc, char*argv[])
{
  QApplication app(argc, argv);
  // which option should I add to argv to run in headless mode
  return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

Ari*_* M. 6

这里有几个选项。您要么需要 Qt 控制台应用程序,要么需要无头 GUI 应用程序。

您会发现真正在无头模式下运行 GUI 相当棘手。这适用于您需要在没有安装 GUI 库的 Linux 系统中运行完全相同的应用程序的情况,例如最小设置。如果没有大量的 xorg 和/或 EGL 库,您会发现这是不可能的。

但不用担心,您可以使用 Qt VNC 平台插件或在Xvfb的帮助下以最小的影响完成此任务。简而言之

解决方案1:使用Qt的VNC插件隐藏它

$ QT_QPA_PLATFORM="vnc"  ./my-app
Run Code Online (Sandbox Code Playgroud)

它是一样的

$ ./my-app -platform vnc
Run Code Online (Sandbox Code Playgroud)

您会发现您的软件有一个 GUI,但它在无头模式下运行,为了查看 GUI,您只需使用任何 vncviewer 连接到它即可。

解决方案 2:避免依赖 Qt 的 VNC 插件

与其他解决方案相同,您可以通过不显示 GUI 来隐藏它。

解决方案 3:使用离屏渲染取消渲染

这与 VNC 非常相似,但你会得到完全空的输出,无法进行 GUI 交互:

$ ./my-app -platform offscreen
Run Code Online (Sandbox Code Playgroud)

解决方案 4:运行 Xvfb 并在那里启动它

你可以运行一个假的 Xorg 服务器并在那里运行东西。

export DISPLAY=:1
Xvfb :1 -screen 0 1024x768x16 &
./myapp &
Run Code Online (Sandbox Code Playgroud)

从给定的解决方案中,我更喜欢离屏渲染,但您的 Qt 编译可能没有该插件,或者可能需要 xcb 或 egl 库。这是你的选择。