【问题标题】:Can I use QApplication AND QCoreApplication?我可以使用 QApplication 和 QCoreApplication 吗?
【发布时间】:2018-12-01 08:26:09
【问题描述】:

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

【问题讨论】:

  • QApplication 继承自 QCoreApplication 所以你并不需要每个实例。
  • 我刚刚留下了一个答案...但要澄清一下,当您在 GUI 中按下这些按钮之一时,您是否真的想要在启动 GUI 的终端中输出?还是您只是在 GUI 本身中显示数据(这是我在回答中假设的)。您可以随时打印到stdout(或coutqInfo() 等)。唯一的技巧是,如果您的目标是 Windows,并且您希望控制台在启动后保持连接到应用程序(以显示任何输出),而不是像默认情况下返回到命令提示符。

标签: qt qapplication qcoreapplication


【解决方案1】:

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

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

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

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

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

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

main() 中,首先处理任何 CLI 选项。然后不启动 GUI,您可以简单地从 main() 调用 exit(0),然后再调用 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 中显示输出使其完全独立。

【讨论】:

  • 并非如此。命令行变体甚至不应尝试初始化 gui 资源,也不应加载特定于 gui 的插件。因此,在知道启动是无 gui 的情况下创建QApplication 通常是错误的。通常会解析参数,然后您决定是实例化 Q[Gui]Application 还是 QCoreApplication
  • 事实上,在 Linux 中,如果您尝试在没有 $DISPLAY 环境变量的终端中运行 QApplication 基础应用程序,它将崩溃。
  • @JoshuaClayton 感谢您提醒我这一点。我已经更新了我的答案,希望更准确。是的,没有$DISPLAY Q[Gui]Application 无法运行(尽管我自己只在远程会话中遇到过这种情况)。
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 2017-06-11
  • 2023-03-14
  • 1970-01-01
  • 2015-04-11
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多