Adding a QWindow to UIKit application on iOS



  • Hi all,

    This is essentially a continuation of this topic:
    https://forum.qt.io/topic/65979/calling-qt-gui-from-native-ios-gui-vice-versa

    I have a requirement to embed Qt content to an iOS application written in Swift.
    For testing purposes I am using Objective-C at first.

    For the example below I am using RasterWindow class from here: https://github.com/msorvig/qt-and-swift/tree/master/QtApplication

    I have created a single-view iOS application using XCode. Then converted it Obj-C++ by changing extensions form ".m" to ".mm". Added Qt library and header paths to the project. Added RasterWindow class. And now I am trying to instantiate and display it like this:

    #include <QApplication>
    #include "rasterwindow.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    RasterWindow* _rwnd;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        static int argc = 0;
        static char* argv = nullptr;
        QGuiApplication* qtAppInstance = new QGuiApplication(argc, &argv);
        
        _rwnd = new RasterWindow();
        _rwnd->show();
        self.view = (__bridge UIView*)reinterpret_cast<void*>(_rwnd->winId());
    
    //    self.view.contentMode = UIViewContentModeScaleToFill;
    //    UIView* qtView = (__bridge UIView*)reinterpret_cast<void*>(_rwnd->winId());
    //    [self.view addSubview:qtView];
    
        NSLog(@"view did load %@", self.view);
        // Do any additional setup after loading the view, typically from a nib.
    }
    

    Execution produces following log:

    virtual void RasterWindow::showEvent(QShowEvent *) QRect(0,0 0x0)
    2018-09-21 06:43:08.165951+0200 QtInObjCiOS[47805:764033] view did load <QUIView: 0x7ffe72409b90; frame = (0 0; 0 0); layer = <CAEAGLLayer: 0x6000027ffb80>>
    -[ViewController viewDidAppear:] QRasterWindow(0x6000003b6a60) QRect(0,0 834x1112)
    

    Visible result is a black screen, the window is not being drawn. If I change from assigning Qt window to self.view to adding it as a subview, then behaviour changes so that RasterWindow instance will have (0,0) size, and I couldn't force it to take size.

    Note, same code works for Mac Cocoa using NSView. As does this simple app

    #include "rasterwindow.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
       QApplication a(argc, argv);
       RasterWindow w;
       w.show();
    
       return a.exec();
    }
    

    What am I missing? How do I correctly add a QWindow to a UIViewController?

    Thank you in advance!

    p.s. Complete project: https://www.dropbox.com/s/mz6ty3922u6vcdp/QtInObjCiOS.zip?dl=0 Mind, you'd have to change library and header paths to match your project and Qt locations.



  • Ok, the problem solved itself with update to Qt 5.11.2 (while running iOS12). Thanks for reading.



  • Ok, the problem solved itself with update to Qt 5.11.2 (while running iOS12). Thanks for reading.