2016-04-07 16 views
14

Attualmente ho una GUI iOS nativa e una Qt-GUI. Sto provando a passare da uno all'altro.Passaggio da GUI iOS nativo a Qt gui

Per essere chiari: quando faccio clic su un pulsante sulla GUI nativa, voglio che la Qt-GUI venga visualizzata e viceversa.

Ho già scoperto quali librerie devo aggiungere per poter usare Qt-Stuff. Ho creato un QApplication nel file AppDelegate.mm:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions { 
    // receive int argc, and char** argv for the QApplication. 
    _qApp = new QApplication(_argc, _argv); 
} 

Inoltre il mio aspetto di applicazioni Qt (al momento) in questo modo:

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

sto chiamando il metodo createQtGUI nel mio ViewController.mm quando si preme un pulsante nella GUI iOS nativa. Il codice viene eseguito senza generare alcun errore, ma:

La Qt-GUI non viene visualizzata. L'applicazione mostra ancora la GUI nativa senza passare alla Qt-GUI.

Qualcuno ha idea di come risolvere il problema?

+0

Dubito molto che funzionerà in quanto entrambi i framework forniscono un ambiente completo progettato per avere il controllo completo del ciclo di esecuzione, gestione degli eventi, ecc. Ecc. – trojanfoe

+0

Direi che hai dimenticato di chiamare un 'QApplicazione :: metodo exec() 'per avviare il ciclo di eventi Qt. – Tomas

+1

@Tomas Anche questo è stato il mio primo pensiero, ma sembra che QApplication si blocchi nel ciclo di eventi nativi. Inoltre ho trovato una guida da qualcuno che è riuscito a farlo e ha menzionato esplicitamente che non è necessario chiamare il metodo exec(). – ParkerHalo

risposta

11

ho finalmente scoperto quello che mancava:

QT-Objects forniscono un metodo chiamato winId(). Questo metodo restituisce uno WId che in realtà è (su iOS) uno UIView*.

Devi aggiungere che UIView* come sottomenu alla tua vista principale.


Al fine di ottenere che ho cambiato il mio metodo createQtGUI come segue:

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

    return window->winId(); 
} 

e nel mio ViewController.mm (dove io chiamo il mio metodo):

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

Nota: La doppia cast (__bridge UIView*)reinterpret_cast<void*>(...) è necessario perché non è possibile trasmettere da WId a UIView* in Objective-C++.

+0

Dovresti sicuramente contrassegnarla come la risposta corretta. – alediaferia

+0

@alediaferia l'ho fatto! – ParkerHalo