簡體   English   中英

帶有可選 gui 的 Qt 應用程序

[英]Qt application with optional gui

我將使用 Qt 編寫程序進行一些圖像處理,我希望它能夠在非 gui 模式(守護進程模式?)下運行。 我的靈感來自 VLC 播放器,它是“典型的”GUI 程序,您可以在其中使用 GUI 對其進行配置,但是當它在沒有 GUI 的情況下運行時,您也可以在non-gui選項中運行它。 然后它使用一些在 GUI 模式下創建的配置文件。

問題是這樣的程序應該如何設計? 應該是一些程序核心,它是獨立於 GUI 的,並且取決於它與 GUI 界面連接的選項?

是的,您可以使用QCommandLineParser對二進制文件使用“無頭”或“gui”選項。 請注意,它僅從 5.3 開始可用,但是如果您仍然不使用它,則在主要系列中的遷移路徑非常順暢。

主程序

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

主程序

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.

當開始以 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();
}

上面 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 for headless,QApplication for GUI,如文檔所示)然后運行應用程序。

可能是因為我正在使用“主要是 Qt 4”代碼並在 Qt 5 上編譯,事情有點奇怪,但這種方法現在有效,所以我沒有進一步調查。

使用 Qt5,運行帶有命令行參數-platform offscreen的 Qt 應用程序會在-platform offscreen繪制。

請參閱文檔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 測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM