抓住新的 QApplication 失败并尝试其他方法

Posted

技术标签:

【中文标题】抓住新的 QApplication 失败并尝试其他方法【英文标题】:catch that new QApplication failed and try something else 【发布时间】:2020-10-09 18:38:49 【问题描述】:

我有两个程序。一个调用 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.```

【问题讨论】:

【参考方案1】:

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

#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);
    

【讨论】:

以上是关于抓住新的 QApplication 失败并尝试其他方法的主要内容,如果未能解决你的问题,请参考以下文章

Pyqt5--为啥 QApplication.processEvents() 更新 GUI 失败

在 MSVC 的发布模式下初始化 QApplication 失败

如何在不退出 python 脚本的情况下销毁一个 QApplication 然后运行一个新的?

如果承诺失败,抓住但做下一个[重复]

使用 QtSql 真的需要 QApplication

“必须在 QWidget 之前构建 QApplication”