【问题标题】:Qt application with optional gui带有可选 gui 的 Qt 应用程序
【发布时间】:2014-07-13 17:40:30
【问题描述】:

我打算使用 Qt 编写程序进行一些图像处理,并且我希望它能够在非 gui 模式(守护程序模式?)下运行。我受到 VLC 播放器的启发,它是“典型的”GUI 程序,您可以在其中使用 GUI 对其进行配置,但是当它在没有 GUI 的情况下运行时,您也可以在 non-gui 选项中运行它。然后它使用一些在 GUI 模式下创建的配置文件。

问题是这样的程序应该怎么设计?应该是一些程序核心,它独立于 GUI 并取决于它与 GUI 界面连接的选项?

【问题讨论】:

  • 有点 - 我的意思是我没有检查它是否适合我,但我改变了方法 - 我将核心作为独立程序,我将使用 gui 来创建配置文件并运行它.

标签: c++ qt qtgui qtcore qapplication


【解决方案1】:

是的,您可以使用QCommandLineParser 对二进制文件使用“headless”或“gui”选项。请注意,它仅从 5.3 开始可用,但如果您仍然不使用它,则在主要系列中迁移路径非常顺利。

main.cpp

#include <QApplication>
#include <QLabel>
#include <QDebug>
#include <QCommandLineParser>
#include <QCommandLineOption>

int main(int argc, char **argv)
{
    QApplication application(argc, argv);
    QCommandLineParser parser;
    parser.setApplicationDescription("My program");
    parser.addHelpOption();
    parser.addVersionOption();

    // A boolean option for running it via GUI (--gui)
    QCommandLineOption guiOption(QStringList() << "gui", "Running it via GUI.");
    parser.addOption(guiOption);

    // Process the actual command line arguments given by the user
    parser.process(application);
    QLabel label("Runninig in GUI mode");
    if (parser.isSet(guiOption))
        label.show();
    else
        qDebug() << "Running in headless mode";

    return application.exec();
}

main.pro

TEMPLATE = app
TARGET = main
QT += widgets
SOURCES += main.cpp

构建并运行

qmake && make && ./main
qmake && make && ./main --gui

用法

    Usage: ./main [options]
My program

Options:
  -h, --help     Displays this help.
  -v, --version  Displays version information.
  --gui          Running it via GUI.

【讨论】:

  • 当我在 qt 中制作简单的应用程序时,我在构造函数 MainWindow 中实现了所有功能,CONNECTIONs(相当于你答案中的 Label)。我知道我应该以同样的方式做所有事情,并添加这样的东西来启动一些过程: else { qDebug()
  • @d21d3q: 标签应该用在非无头模式下,即 if 分支。
  • 你的意思是在gui模式的情况下它应该在非无头模式下使用?在无头模式的情况下,这个lable.startSomeProcess() 怎么样?
  • @d21d3q:无头:控制台,非无头:gui。另外,我认为您稍微误解了标签在 Qt 世界中的含义。 QLabel 是一个 gui 元素。它不会启动任何进程...
  • 我知道是gui元素。到这个时候,我只处理main.c MainWindow 正在创建(并显示)并在其中实现整个程序的情况。我想我明白了——我应该像往常一样做到,但不表现出来?
【解决方案2】:

您可以在开始以 gui 或非 gui 模式显示时将参数传递给您的应用程序。例如,如果您在命令行中运行时传递 -non-gui 参数,则应用程序不应该显示主窗口,它应该做一些其他的事情:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;

    bool GUIMode=true;

    int num = qApp->argc() ;
    for ( int i = 0; i < num; i++ )
    {
        QString s = qApp->argv()[i] ;
        if ( s.startsWith( "-non-gui" ) )
            GUIMode = false;
    }

    if(GUIMode)
    {
         w.show();
    }
    else
    {
        //start some non gui functions
    }

    return a.exec();
}

【讨论】:

    【解决方案3】:

    上面 lpapp 的示例对我不起作用,因为我得到了

    qt.qpa.screen: QXcbConnection: Could not connect to display localhost:10.0
    Could not connect to any X display.
    

    在没有 X 显示的情况下运行时(DISPLAY 的任何值,而不仅仅是 localhost:10.0)。

    有一个解决方法 - export QT_QPA_PLATFORM='offscreen' - 但这不是命令行选项,您的用户应该这样做,这不好。

    因此,在此处发布问题后,进一步研究将我引向以下 QT5 文档,该文档解释了根据命令行选项使用或不使用 GUI 的“已批准”启动方式:

    https://doc.qt.io/qt-5/qapplication.html#details

    但是,您的里程可能会有所不同。那里的例子对我来说也“不合适”!

    我必须使用命令行参数然后选择两种方法之一来运行。每个方法创建自己的应用程序对象(QCoreApplication 用于无头,QApplication 用于 GUI,如文档所示),然后运行应用程序。

    这可能是因为我正在使用“主要是 Qt 4”代码并在 Qt 5 上进行编译,所以事情有点奇怪,但这种方法现在有效,所以我没有进一步调查。

    【讨论】:

      【解决方案4】:

      使用 Qt5,运行带有命令行参数 -platform offscreen 的 Qt 应用程序确实会画出屏幕。

      查看文档https://doc.qt.io/qt-5/qguiapplication.html#QGuiApplication

      目前支持的选项如下:

      -platform platformName[:options],指定Qt Platform Abstraction(QPA)插件。

      覆盖 QT_QPA_PLATFORM 环境变量。

      支持的平台名称列在platformName docs

      使用 Qt 5.15.1 测试

      【讨论】:

        猜你喜欢
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多