从本地iOS GUI切换到Qt GUI

14

我目前拥有一个本地的iOS GUI和一个Qt-GUI。我正在尝试从一个切换到另一个。

明确一下:当我在本地GUI上单击按钮时,我希望Qt-GUI出现,反之亦然。

我已经找出需要添加哪些库来使用Qt-Stuff。我在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。

有人有什么想法如何解决这个问题吗?


我非常怀疑这会起作用,因为两个框架都提供了完整的环境,旨在完全控制运行循环、事件处理等等。 - trojanfoe
我会说你忘记调用QApplication::exec()方法来启动Qt事件循环。 - Tomas
1
@Tomas 那也是我的第一反应,但似乎QApplication会将自己挂在本地事件循环中。我还找到了一个指南,由某人成功实现了这一点,并明确提到您不必调用exec()方法。 - ParkerHalo
@trojanfoe,我找到了一份指南,在Qt 5.3下准确地完成了这个过程。我觉得我只是缺少一个小部分,比如将Qt GUI元素带到本机iOS视图或其他什么东西。 - ParkerHalo
@ParkerHalo 然后尝试在您的本地事件循环中调用 QApplication::processEvents()。Qt 事件只需进行处理。 - Tomas
@Tomas 编辑:我刚试了一下,什么也没发生... 仍然只显示本地GUI。 - ParkerHalo
1个回答

11

我最终找到了缺失的部分:

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

您需要将该UIView*作为子视图添加到主视图中。


为了实现这一点,我按以下方式更改了我的createQtGUI方法:

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

    return window->winId();
}

在我的ViewController.mm(我调用方法的地方)中:

- (IBAction)ButtonClicked:(id)sender {
    UIView* newView = (__bridge UIView*)reinterpret_cast<void*>(createQtGUI());
    [self.view addSubview:newView];
}

注意:双重转换 (__bridge UIView*)reinterpret_cast<void*>(...) 是必要的,因为在 Objective-C++ 中不能直接从 WId 转换到 UIView*


你肯定要把这个标记为正确答案。 - alediaferia
嗨,Parker:我有一个几乎相同的需求。我是QT的新手,但我是一名iOS开发者。我已经在QT中创建了一个模块,并希望在任何按钮点击时在本地iOS应用程序中打开此模块。这可能吗?我相信你已经做过类似的事情了。 - charanjit singh
嗨@charanjitsingh,是的,这是可能的。QT对象(如视图)具有一个名为winId()的方法,它返回一个UIView*。您可以将该UIView*嵌入到您的本机应用程序中。有关更多信息,请参见我上面的答案。 - ParkerHalo
谢谢回复:是的,我可以看到上面描述的方法,但我的担心是我甚至不知道如何开始我的工作。我在mainWindow.cpp qt项目中创建了“createQtGUI”,并且在本地iOS应用程序中有viewController.mm。我的问题是如何在两个不同的项目之间进行通信,以及链接步骤应该是什么。请帮忙。 - charanjit singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接