具有可选GUI的Qt应用程序

6
我打算使用Qt编写一些图像处理程序,并希望它能够在非GUI模式(守护进程模式?)下运行。我受到了VLC播放器的启发,它是一个“典型”的GUI程序,你可以使用GUI配置它,但你也可以在没有GUI的情况下运行它,此时它将使用在GUI模式下创建的某些配置文件。
问题是这样的程序应该如何设计?是否应该有一个程序核心,它与GUI界面无关,并根据选项与GUI界面进行连接?

有点意思 - 我的意思是我没有检查它是否适用于我,但我改变了方法 - 我将把核心作为独立程序,使用GUI创建配置文件并运行它。 - d21d3q
4个回答

9

是的,您可以使用QCommandLineParser来使用“无头”或“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(相当于您回答中的Label)中。我知道我应该以同样的方式完成所有操作,并添加类似以下内容来启动某个进程: else { qDebug() << "Running in headless mode"; label.startSomeProcess()} ? - d21d3q
@d21d3q:标签应该在非无头模式下使用,即if分支中。 - László Papp
在 GUI 模式下,你的意思是它应该在非无头模式下使用?那么在无头模式下,lable.startSomeProcess() 怎么办? - d21d3q
@d21d3q:无头模式:控制台,非无头模式:图形用户界面。此外,我认为您对Qt世界中标签的含义有些误解。QLabel是一个GUI元素,它不会启动任何进程... - László Papp
我知道这是GUI元素。到目前为止,我只处理在main.c中创建(并显示)MainWindow,并在其中实现整个程序的情况。我想我明白了 - 我应该像往常一样制作它,但不显示它? - d21d3q
我建议不要在主窗口中实现逻辑。它应该仅用于GUI交互。从中提取出可以直接从main.cpp或mainwindow.cpp中使用的逻辑。可能的快速解决方法是不显示它。 - László Papp

4

当启动应用程序时,您可以传递一个参数以在GUI或非GUI模式下显示。例如,如果在命令行中运行时传递了-nongui参数,则应用程序不应显示主窗口,并且应该执行一些其他操作:

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();
}

2

lpapp上面的例子对我没用,因为我得到了

Original Answer

作为错误信息。

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上编译,所以事情有点奇怪,但这种方法现在有效,因此我没有进一步调查。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接