我可以使用 QApplication 和 QCoreApplication 吗?

Can I use QApplication AND QCoreApplication?

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

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

UPDATE 1:评论者是正确的,根据实际需要实例化 QCoreApplicationQ[Gui]Application 会更好...

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

UPDATE 2: ...所以最好先解析命令行并确定应该使用哪种 Q*Application "flavor"...

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

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

main() 中,首先处理任何 CLI 选项。然后为了不启动 GUI 你可以在调用 app.exec().

之前简单地从 main() exit(0)

一个基本的例子:

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 合二为一 window 并在控制台中输出)可能会相当尴尬,并且在 GUI 中显示输出使其非常独立。