Переход от родного iOS gui к Qt gui

В настоящее время у меня есть собственный графический интерфейс iOS и Qt-GUI. Я пытаюсь перейти от одного к другому.

Чтобы быть ясным: когда я нажимаю кнопку на встроенном графическом интерфейсе, я хочу, чтобы Qt-GUI отображался и наоборот.

Я уже выяснил, какие библиотеки я должен добавить, чтобы иметь возможность использовать Qt-Stuff. Я создал QApplication в файле AppDelegate.mm:

- (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();
}

Я вызываю метод createQtGUI в своем ViewController.mm при нажатии кнопки в родном графическом интерфейсе iOS. Код запускается без каких-либо ошибок, но:

Qt-GUI не отображается. Приложение по-прежнему показывает родной gui, не переключаясь на Qt-GUI.

Кто-нибудь понял, как это исправить?

Ответы

Ответ 1

Наконец-то я узнал, чего не хватает:

Qt-Objects предоставляет метод под названием winId(). Этот метод возвращает a WId, который на самом деле (на iOS) a UIView*.

Вы должны добавить, что UIView* как Subview на ваш основной вид.


Чтобы добиться этого, я изменил свой метод 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*>(...) необходим, потому что вы не можете просто отбрасывать от WId до UIView* в Objective-C ++.