Important: Please read the Qt Code of Conduct -

Adding a QWindow to UIKit application on iOS

  • Hi all,

    This is essentially a continuation of this topic:

    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:

    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 ()
    @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();
        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;;
       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: 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.