【问题标题】:Determine if the system can instantiate QApplication (GUI support)确定系统是否可以实例化 QApplication(GUI 支持)
【发布时间】:2014-12-29 17:10:20
【问题描述】:

我的程序可以在没有 GUI 的服务器或桌面上运行。 当它在可以显示 GUI 的系统上运行时,我想要实例化 QApplication,而当它在服务器上时,我想要 QCoreApplication。

如果我在服务器上实例化 QApplication,它要么是 Segfault(至少以前是这样),要么显示错误消息并退出,而我没有机会实例化 QCoreApplication:

此应用程序无法启动,因为它无法找到或加载 Qt 平台插件“xcb”。可用的平台插件有:linuxfb、 最小,离屏。重新安装应用程序可能会解决此问题。

真的吗?

目前,当我在服务器上运行我的程序时,我只传递了一个 -noGui 参数。它工作正常,但我想检测系统是否可以使用 QApplication,所以我可以摆脱这个论点。

我确信在某个地方已经找到了答案,但我无法得到答案。

【问题讨论】:

  • 那你为什么不检查一下插件呢?
  • 插件可能因系统而异,这可能会导致误报。我使用 Qt 来实现“代码一次,无处不在”的东西。我更喜欢 Qt 库中更清洁和标准的方式,但是是的,这可能是最后的解决方案。
  • 不,不,事实上,这可以在没有 ifdefs 的情况下编程。
  • 是的,对...如果我想要在 gui 可用的情况下运行 cli 怎么办?这种自动思考而不是用户对我来说听起来很糟糕。
  • 为什么没有经验的用户(即无法设置命令行选项的用户)会操作无头服务器!?对此的标准解决方案是提供命令行参数。

标签: c++ qt user-interface console


【解决方案1】:

以防万一有人想知道我是如何解决这个问题的,我截取了 QApplication 发送的 SIGABRT 信号,然后实例化 QCoreApplication。 它工作得非常好,而且是跨平台的。

#include <QApplication>
#include <csetjmp>
#include <csignal>
#include <cstdlib>

jmp_buf env;

void onSigabrt(int)
{
    longjmp (env, 1);
}

QCoreApplication *loadQt(bool gui)
{
    QCoreApplication *application = NULL;

    if (gui)
    {
        if (setjmp(env) == 0)
        {
            signal(SIGABRT, &onSigabrt);
            application = new QApplication();
        }
        signal(SIGABRT, SIG_DFL);
    }
    if (!application)
        application = new QCoreApplication();
    return (application);
}

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2013-05-24
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多