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