C++ QML应用程序

C++ QML应用程序,c++,qt,user-interface,qml,C++,Qt,User Interface,Qml,我的程序有两种模式GUI(在qml上)和没有GUI(命令行)。通过在cmd中传递参数来更改模式,我必须编写什么代码 例如,如果我传递nameofapp.exe-没有gui必须是工作没有gui版本 对于简单的qt/c++应用程序,我们有以下代码 QCoreApplication* createApplication(int &argc, char *argv[]) { for (int i = 1; i < argc; ++i) if (!qstrcmp(ar

我的程序有两种模式GUI(在qml上)和没有GUI(命令行)。通过在cmd中传递参数来更改模式,我必须编写什么代码 例如,如果我传递nameofapp.exe-没有gui必须是工作没有gui版本 对于简单的qt/c++应用程序,我们有以下代码

QCoreApplication* createApplication(int &argc, char *argv[])
{
    for (int i = 1; i < argc; ++i)
        if (!qstrcmp(argv[i], "-no-gui"))
            return new QCoreApplication(argc, argv);
    return new QApplication(argc, argv);
}

int main(int argc, char* argv[])
{
    QScopedPointer<QCoreApplication> app(createApplication(argc, argv));

    if (qobject_cast<QApplication *>(app.data())) {
       // start GUI version...
    } else {
       // start non-GUI version...
    }

    return app->exec();
}
QCoreApplication*createApplication(int&argc,char*argv[])
{
对于(int i=1;iexec();
}
它来自文档,我想为qml提供这样的信息
操作系统是windows 7 ultimate,但我不认为它取决于操作系统。每个应用程序类型至少需要一个顶级
QObject
,它将在主事件循环中“使事情发生”

假设您已经在视图和后端之间明确划分了关注点(例如MVC),那么您将有3个类(分别是
QObject
):

  • MyAppBackend
    哪个做实际工作
  • myguimain窗口
    用于管理GUI输入\输出
  • 管理命令行输入\output的MyCLIMainObject
每个人都应该有开始工作的方法。例如,仅仅显示一个小部件就是简单的Qt应用程序的启动方式

int main()
{
  QApplication app;

  MyGUIMainWindow window;
  window.show();

  return app.exec();
}
window.show()
将在
app.exec()
时对事件进行排队处理。被执行

您需要对发布事件或发出信号的函数执行相同的操作

int main(int argc, char* argv[])
{
    QScopedPointer<QCoreApplication> app(createApplication(argc, argv));

    MyAppBackend backend;
    backend.startDeffered();

    if (qobject_cast<QApplication *>(app.data())) {
       // start GUI version...
       MyGUIMainWindow* window = new MyGUIMainWindow(0,...);
       window->show();
    } else {
       // start non-GUI version...
       MyCLIMainObject* cliobj = new MyCLIMainObject(0,...);
       cliobj->showCLi();
    }

    return app->exec();
}
intmain(intargc,char*argv[])
{
QScopedPointer应用程序(createApplication(argc,argv));
MyAppBackend;
backend.startDeffered();
if(qobject_cast(app.data())){
//启动GUI版本。。。
MyGUIMainWindow*window=新的MyGUIMainWindow(0,…);
窗口->显示();
}否则{
//启动非GUI版本。。。
MyCLIMainObject*cliobj=新的MyCLIMainObject(0,…);
cliobj->showCLi();
}
返回app->exec();
}

什么操作系统?如果您想以Windows为目标,请记住Windows并不真正支持双模式应用程序。那么你到底有什么问题?该示例代码对我来说似乎足够清晰。我将尝试此方法,但我编写的代码没有类,只是在if的GUI版本中运行qml引擎,但程序不起作用。如果您的代码仅在控制台模式下工作,则这种代码仅适用于qt(而不是qml),您应该尝试完全删除控制台功能,只实现GUI版本。如果gui版本不起作用,请修复它,然后重试。顺便说一句:对于仅使用qml的应用程序,您不需要QApplication,但需要QGUI应用程序,但这不是您的问题。