捕获到新的QApplication失败并尝试其他操作

问题描述

我有两个程序。一个叫SelectScreen,另一个叫RadioPanel。

SelectScreen向RadioPanel发送一条消息,告诉它应该在哪个屏幕上显示gui。

RadioPanel使用setenv(“ disPLAY”,myHostslist [hostId] .c_str(),true);设置disPLAY环境变量。然后一个mQtApplication = new QApplication(mArgc,mArgv);启动gui。

只要主机信息正确,此方法就起作用。但是,如果不正确,QApplication将导致程序结束。我想做的就是捕捉到QApplication失败的事实,并尝试在“:0”上运行gui

我尝试使用try catch块,但不会捕获。我的猜测是QApplication只是结束了过程,在这种情况下不会引发异常。

有人知道是否有一种方法可以确定QApplication将要失败还是对该失败做出响应。

我在QApplication失败时收到的消息是:

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application Failed to start because no Qt platform plugin Could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs,linuxfb,minimal,minimalegl,offscreen,vnc,wayland-egl,wayland,wayland-xcomposite-egl,wayland-xcomposite-glx,xcb.```

解决方法

我找到了解决方案。如果您使用XOpenDisplay,则可以在尝试创建QApplication之前检查返回值以确认X Server显示器是否正常工作。

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

void myUiApplication::qtGuiThread()
{
    Display *dis;
    dis=XOpenDisplay((char *)0);
    if(dis!=nullptr)
    {
        XCloseDisplay(dis);
        mQtApplication = new QApplication(mArgc,mArgv);
    } else 
    {
        CCS_ERR("Failed to display on host:" << cds::toString(mCdsId) << " " 
                << mCdsHosts[mCdsId].c_str() << ".\nPlease edit the " 
                << getConfigFileName() << " file. Attempting to run GUI on local X Server.");
        setenv("DISPLAY",":0",true);
        mQtApplication = new QApplication(mArgc,mArgv);
    }
}