1

我有一个在 Qt5 中使用 QCoreApplication 的控制台应用程序。此应用程序具有不同的功能,如“printABC”或“printSUV”。输出将出现在终端中。现在我想做一个 Gui,我可以在其中按下“printABC”或“printSUV”按钮,输出也会出现在终端中,这样使用应用程序就“更容易”了。在 Qt5 中,我可以使用我已经完成的 QCoreApplication 制作控制台应用程序。所以我的问题是如何添加一个沿途运行的 QApplication ?在文档中,建议在 main 函数中创建一个 QApplication/QCoreApplication,那么如何同时创建呢?

4

1 回答 1

2

您可以轻松拥有一个同时支持命令行(终端)模式和 GUI 模式的应用程序。 只需使用QApplication(或QGuiApplication仅用于 QML 的应用程序)。

更新1:评论者是正确的,最好实例化QCoreApplicationQ[Gui]Application取决于实际需要的...

然后,例如,如果用户传递 CLI 选项,您只需运行函数并将结果发送到sdtout(大概就像您现在正在做的那样)。否则显示 GUI 并使用相同的功能,但以其他方式(在 UI 中)显示数据。

更新2:...所以最好先解析命令行并确定应该使用哪个Q*Application“风味”...

如果您还没有,您可以查看QCommandLineParser以帮助处理 CLI 选项。请记住,它也与 a 完全相同Q[Gui]Application

更新3:...实际上QCommandLineParser可以在Q*Application创建 a 之前使用。只需parse()使用来自的选项列表调用argv,而不是process()使用应用程序实例。请参阅下面的代码示例。

main()中,首先处理任何 CLI 选项。然后不启动 GUI,您可以简单地exit(0)main()调用app.exec().

一个基本的例子:

int main(int argc, char *argv[]) {
    QCoreApplication *app;

    QCommandLineParser clp;
    clp.setApplicationDescription("My app does great things.");
    clp.addOptions({{"cli", "Use CLI interface"}});

    QStringList opts;
    for (int i=0; i < argc; ++i)
        opts << QString(argv[i]);

    clp.parse(opts);
    if (clp.isSet("cli"))
        app = new QCoreApplication(argc, argv);
    else
        app = new QApplication(argc, argv);

    ...

    return app->exec();  // or maybe just 0, or app->exit(), if no event loop is needed.
}

如果您想在启动应用程序的控制台中显示输出,那么您仍然可以简单地打印到stdout(或您现在正在执行的任何操作)。但是,如果您希望它在 Windows 上运行,可能需要额外的步骤......并且有一些事情需要考虑。我认为这确实是一个不同问题的主题。恕我直言,将两者混合(一个窗口中的 GUI 和控制台中的输出)可能会相当尴尬,并且在 GUI 中显示输出使其完全独立。

于 2018-06-22T12:35:23.467 回答