path: root/src/plugins/platforms/ios/
diff options
authorTor Arne Vestbø <>2012-11-11 16:32:54 +0100
committerTor Arne Vestbø <>2013-02-27 23:55:42 +0100
commite71ca36161626020f7c641dcc83c0c02dc4d561b (patch)
tree64b211b2091df5f3a5fec9887157ee43354baac1 /src/plugins/platforms/ios/
parent3241f37711bd35988c7a21cc8a4833ec2fa3132d (diff)
iOS: Ensure UIApplicationMain is started before QApplication by wrapping main()
For the typical Qt app the developer will have an existing main() that looks something like: int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); return app.exec(); } To support this, we provide our own 'main' function in the qtmain static library that we link into the application, which calls UIApplicationMain and redirects to the 'main' function of the application after the event loop has started spinning. For this to work, the applications 'main' function needs to manually be renamed 'qt_main' for now. In a later patch, this renaming will happen automatically by redefining main from either a header file, or more likely, from the Makefile created by qmake. For the case of an iOS developer wanting to use Qt in their existing app the main will look something like: int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } This is supported right now by just linking in libqios.a without libqiosmain.a. QGuiApplication should then be created e.g inside the native apps application delegate (but QGuiApplication::exec should not be called). In the future, we plan to but use a wrapper library that brings in all the Qt dependencies into one single static library. This library will not link against qtmain, so there won't be a symbol clash if the -ObjC linker option is used. We should then add the required magic to the future Objective-C convenience wrapper for QML to bring up a QGuiApplication, which would allow using Qt from storyboards and NIBs. This would also be the place to inject our own application delegate into the mix, while proxying the delegate callbacks to the user's application delegate. Change-Id: Iba5ade114b27216be8285f36100fd735a08b9d59 Reviewed-by: Tor Arne Vestbø <> Reviewed-by: Richard Moe Gustavsen <>
Diffstat (limited to 'src/plugins/platforms/ios/')
1 files changed, 8 insertions, 23 deletions
diff --git a/src/plugins/platforms/ios/ b/src/plugins/platforms/ios/
index 1b3dc18dd7..41a3fff84f 100644
--- a/src/plugins/platforms/ios/
+++ b/src/plugins/platforms/ios/
@@ -45,34 +45,13 @@
@implementation QIOSApplicationDelegate
+@synthesize window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- // If this application delegate is instanciated, it means that
- // this plugin also created UIApplication. We then also create a
- // window with a view controller, and set all QWindow views
- // as children of the controller view:
- self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- UIViewController *controller = [[UIViewController alloc] init];
- self.window.rootViewController = controller;
- controller.view = [[UIView alloc] init];
- QWindowList windows = QGuiApplication::topLevelWindows();
- for (int i=0; i<windows.size(); ++i) {
- if (QIOSWindow *w = static_cast<QIOSWindow *>(windows[i]->handle())) {
- UIView *winView = w->nativeView();
- if (winView && !winView.superview)
- [controller.view addSubview:winView];
- }
- }
- // Aid debugging during development
- self.window.backgroundColor = [UIColor cyanColor];
- controller.view.backgroundColor = [UIColor magentaColor];
- [self.window makeKeyAndVisible];
return YES;
@@ -104,6 +83,12 @@
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+- (void)dealloc
+ [window release];
+ [super dealloc];