2016-04-07 7 views
14

पर स्विचिंग वर्तमान में मेरे पास मूल आईओएस जीयूआई और एक क्यूटी-जीयूआई है। मैं एक से दूसरे में स्विच करने की कोशिश कर रहा हूं।देशी आईओएस gui से Qt gui

स्पष्ट होने के लिए: जब मैं मूल जीयूआई पर एक बटन पर क्लिक करता हूं तो मैं क्यूटी-जीयूआई को दिखाना चाहता हूं और इसके विपरीत।

मुझे पहले से ही पता चला है कि मुझे कौन सी पुस्तकालयों को क्यूटी-स्टफ का उपयोग करने में सक्षम होना है। जब एक बटन दबाने

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

मैं अपने ViewController.mm में createQtGUI विधि फोन कर रहा हूँ: (इस समय)

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

इसके अलावा मेरी क्यूटी आवेदन दिखता है इस तरह: मैं AppDelegate.mm फ़ाइल में एक QApplication बनाया मूल आईओएस जीयूआई में। कोड किसी भी त्रुटि को फेंकने के बिना चलता है, लेकिन:

क्यूटी-जीयूआई नहीं दिखाया गया है। आवेदन अभी भी क्यूटी-जीयूआई में स्विच किए बिना देशी गुई दिखाता है।

क्या किसी को यह पता चला है कि इसे कैसे ठीक किया जाए?

+0

मुझे बहुत संदेह है कि यह काम करेगा क्योंकि दोनों ढांचे एक पूर्ण वातावरण प्रदान करते हैं जो रन-लूप, इवेंट हैंडलिंग इत्यादि के पूर्ण नियंत्रण के लिए डिज़ाइन किए गए हैं। – trojanfoe

+0

मैं कहूंगा कि आप 'क्यूप्लिकेशंस :: क्यूटी घटना लूप शुरू करने के लिए exec() 'विधि। – Tomas

+1

@ टॉमस यह मेरा पहला विचार भी था, लेकिन ऐसा लगता है कि क्यूप्लिकेशंस खुद को मूल घटना लूप में लटका देता है। इसके अलावा मुझे किसी ऐसे व्यक्ति से एक मार्गदर्शिका मिली है जो ऐसा करने में कामयाब रहा और उसने स्पष्ट रूप से उल्लेख किया कि आपको exec() विधि को कॉल करने की आवश्यकता नहीं है। – ParkerHalo

उत्तर

11

मैं अंत में पता चला गया है क्या याद आ रही थी:

क्यूटी-वस्तुओं के लिए एक विधि winId() कहा जाता है प्रदान करते हैं। यह विधि WId देता है जो वास्तव में (आईओएस पर) 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*>(...) आवश्यक है क्योंकि आप उद्देश्य-सी ++ में WId से UIView* तक नहीं डाले जा सकते हैं।

+0

दिखा रहा है आपको निश्चित रूप से इसे सही उत्तर के रूप में चिह्नित करना चाहिए। – alediaferia

+0

@alediaferia मैंने किया था! – ParkerHalo