Qt 5.1 应用程序无显示 - QXcbConnection:无法连接到显示器

22
我正在使用Qt5.1,并尝试创建一个没有显示的QApplication。 我需要使用QApplication(或QGuiApplication)绘制文本,否则我会得到segfault。 在Qt4.8中应用程序运行良好,但是在Ubuntu无头版本上使用Qt5.1时出现错误:“QXcbConnection:无法连接到显示器”。 在Qt 4.8中,我能够使用 GUIenabled = false 的以下构造函数创建不需要显示器的QApplication: QApplication::QApplication(int &argc,char **argv,bool GUIenabled) 但是,在Qt5.1中,QApplication的构造函数不再具有GUIenabled标志。 我简要地扫描了源代码,QApplication构造函数中似乎有一个标志,但未说明可以在该标志中使用哪些选项。 使用“false”无效。 如何创建没有显示的QApplication?是否有一种替代方法来告诉QApplication GUIenabled = false? 或者,我可以创建QCoreApplication,在QImage上绘制文本而不会导致segfault吗?

在删除 /tmp 目录下的文件后,我遇到了这个问题。 - Geremia
3个回答

25

是的,这是一个在Qt 5中消失的Qt 3 (?)功能。尝试使用-platform offscreen命令行选项运行应用程序。

请注意,您不需要QApplication或链接到QtWidgets来绘制QImage,只需使用QGuiApplication(并链接到QtGui)即可。


2
使用QGuiApplication和命令行选项-platform offscreen时,我遇到了以下错误:Failed to load platform plugin "offscreen". Available platforms are: xcb我从源代码静态编译了Qt。这是问题所在吗? - Vincent
我设法让-platform offscreen工作了,但是接着我遇到了错误QFontDatabase: Cannot find font directory '/***/lib/fonts' - is Qt installed correctly?。我尝试了-platform minimal,但是还是出现了同样的错误。 - Vincent
这听起来像是您的构建中出现了问题,或者是Qt中的一个错误。尝试将QT_QPA_FONTDIR环境变量设置为该目录的正确路径。我猜测offscreen插件并没有完全使用fontconfig... - peppe
1
当在运行无头Linux的Jenkins服务器上尝试对Qt GUI进行QTest时,此解决方案非常有用。 - LAL
1
使用 make check TESTARGS="-platform offscreen" 运行 QTest,并从 .pro 项目文件中删除 QtCreator 为您添加的 QT -= gui 行。 - Mark Ch
请注意,要进行一些有意义的UI测试,您仍需要一个显示器,Xvfb或Xnest可能对此有用。 - peppe

5
如果你想创建一个没有GUI的应用程序,你需要使用QCoreApplication而不是QApplication

3
我不能使用QCoreApplication因为我需要使用QPainter来绘制文本。如果我使用QCoreApplication,在我尝试在QImage中绘制文本时,会导致分段错误,所以我需要使用QApplication或者QGuiApplication。 - Vincent

0
刚碰到了同样的问题。真是让人烦恼,至少它不是一个编译错误。我的解决方案就是使用指针和堆对象,像这样,
   QCoreApplication* app = 0;
   
   Display* display = XOpenDisplay(NULL);

   if (display)
   {  
      XCloseDisplay(display);
      app = new QApplication(argc, argv);
      qobject_cast<QApplication*>(app)->setQuitOnLastWindowClosed(false);
   }
   else
   {  
      app = new QCoreApplication(argc, argv);
   }
   return app->exec();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接