我有一个在 Qt5 中使用 QCoreApplication 的控制台应用程序。此应用程序具有不同的功能,如“printABC”或“printSUV”。输出将出现在终端中。现在我想做一个 Gui,我可以在其中按下“printABC”或“printSUV”按钮,输出也会出现在终端中,这样使用应用程序就“更容易”了。在 Qt5 中,我可以使用我已经完成的 QCoreApplication 制作控制台应用程序。所以我的问题是如何添加一个沿途运行的 QApplication ?在文档中,建议在 main 函数中创建一个 QApplication/QCoreApplication,那么如何同时创建呢?
1 回答
您可以轻松拥有一个同时支持命令行(终端)模式和 GUI 模式的应用程序。 只需使用QApplication
(或QGuiApplication
仅用于 QML 的应用程序)。
更新1:评论者是正确的,最好实例化QCoreApplication
或Q[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 中显示输出使其完全独立。