C++ 从本机iOS gui切换到Qt gui

C++ 从本机iOS gui切换到Qt gui,c++,ios,objective-c,qt,C++,Ios,Objective C,Qt,我目前有一个本机iOS GUI和一个Qt GUI。我正试着从一个切换到另一个 需要明确的是:当我单击本机GUI上的按钮时,我希望QtGUI显示出来,反之亦然 我已经找到了我必须添加哪些库才能使用Qt的东西。我在AppDelegate.mm文件中创建了一个QApplication: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *) launchOption

我目前有一个本机iOS GUI和一个Qt GUI。我正试着从一个切换到另一个

需要明确的是:当我单击本机GUI上的按钮时,我希望QtGUI显示出来,反之亦然

我已经找到了我必须添加哪些库才能使用Qt的东西。我在
AppDelegate.mm
文件中创建了一个
QApplication

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {
    // receive int argc, and char** argv for the QApplication.
    _qApp = new QApplication(_argc, _argv);
}
此外,我的Qt应用程序(目前)看起来如下:

void createQtGUI() {
    QPushButton* btn = new QPushButton("Some Button");
    QLabel* lbl = new QLabel("QTGui");
    QVBoxLayout* layout = new QVBoxLayout();
    layout->addWidget(lbl);
    layout->addWidget(btn);

    QWidget* window = new QWidget();
    window->setLayout(layout);
    window->show();
}
按下本机iOS GUI中的按钮时,我正在调用我的
ViewController.mm
中的
createQtGUI
方法。代码运行时不会引发任何错误,但是:

未显示Qt GUI。应用程序仍然显示本机gui,而不切换到Qt gui。


有人知道如何修复吗?

我终于找到了缺失的地方:

Qt对象提供了一个名为
winId()
的方法。此方法返回一个
WId
,它实际上是(在iOS上)一个
UIView*

您必须将
UIView*
作为子视图添加到主视图中


为了实现这一点,我将我的
createQtGUI
方法更改如下:

WId createQtGUI() {
    ... // nothing changed here (only at the end)
    window->show();

    return window->winId();
}
在我的
ViewController.mm
(在这里我调用我的方法):

-(iAction)按钮点击:(id)发件人{
UIView*newView=(\uu桥UIView*)重新解释强制转换(createQtGUI());
[self.view addSubview:newView];
}

注意:在Objective-C++中,双重转换
(\uu-bridge UIView*)重新解释转换(…)
是必要的,因为您不能仅从
WId
转换到
UIView*

我非常怀疑这会起作用,因为这两个框架都提供了一个完整的环境,其设计目的是完全控制运行循环、事件处理、,等等。等等。我想说你忘了调用
QApplication::exec()
方法来启动Qt事件循环。@托马斯这也是我的第一个想法,但QApplication似乎挂起到了本机事件循环中。另外,我还找到了一个指导,他明确提到您不必调用exec()方法。@trojanfoe我找到了一个指导,在Qt 5.3下,这是在哪里完成的。我觉得我只缺少了一小部分,比如将QtGUI元素带到本机ios视图或something@ParkerHalo然后尝试在本机事件循环中调用
QApplication::processEvents()
。Qt事件只是需要处理。你一定要把它标记为正确答案。嗨,帕克:我有几乎相同的要求。我是QT新手,但我是一名iOS开发人员。我在QT中创建了一个模块,并希望在单击任何按钮时在本机iOS应用程序中打开此模块。可能吗?我相信你已经做到了。嗨@charanjitsingh,是的,这是可能的。QT对象(如视图)有一个方法
winId()
,它返回一个
UIView*
。您可以将该
UIView*
嵌入到本机应用程序中。有关更多信息,请参阅以上我的答案谢谢回复:是的,我可以看到上面描述的方法,但我担心的是我甚至不知道如何开始我的工作。我已经在mainWindow.cpp qt项目中创建了“createQtGUI”,并且在本机iOS应用程序中创建了viewController.mm。我关心的是,我将如何在两个不同的项目之间进行沟通,以及链接步骤应该是什么。请帮忙。
- (IBAction)ButtonClicked:(id)sender {
    UIView* newView = (__bridge UIView*)reinterpret_cast<void*>(createQtGUI());
    [self.view addSubview:newView];
}