带有可选gui的Qt应用程序

问题描述 投票:6回答:3

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

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

c++ qt qtgui qtcore qapplication
3个回答
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

Build and Run

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

Usage

    Usage: ./main [options]
My program

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

3
投票

当你开始以gui或non-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();
}

1
投票

上面的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

但是,您的里程可能会有所不同那个例子对我来说也没有“正常工作”!

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

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

- 彼得

© www.soinside.com 2019 - 2024. All rights reserved.