#qt #display #host #xcb #qapplication
#qt #отобразить #хост #xcb #qapplication
Вопрос:
У меня есть две программы. Один вызов SelectScreen, а другой — RadioPanel.
SelectScreen отправляет сообщение RadioPanel, сообщая ему, на каком экране он должен отображать графический интерфейс.
RadioPanel использует setenv(«DISPLAY», myHostslist[hostId].c_str(),true); для установки переменной среды отображения. Затем mQtApplication = new QApplication(mArgc, mArgv); для запуска графического интерфейса.
Это работает до тех пор, пока информация о хосте верна. Однако, если это неверно, QApplication приводит к завершению программы. Что я хочу сделать, так это уловить тот факт, что QApplication не удалось, и попытаться запустить графический интерфейс на «: 0»
Я попытался использовать блок 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, вы можете проверить возврат, чтобы подтвердить, что отображение X Server работает, прежде чем пытаться создать QApplication.
#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);
}
}