From f370f77e48a06464af12d74d2ccb093c130726ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 2 Sep 2013 12:41:50 +0200 Subject: Port QMacNativeWidget to Qt 5 Also adds examples/widgets/mac subdir for Mac specific examples, starting with one for this feature. Change-Id: I4cc7d84ce3d7562259d6206faa5d6996c2392a3e Reviewed-by: Liang Qi --- examples/widgets/mac/mac.pro | 5 + examples/widgets/mac/qmacnativewidget/main.mm | 142 +++++++++++++++++++++ .../mac/qmacnativewidget/qmacnativewidget.pro | 7 + 3 files changed, 154 insertions(+) create mode 100644 examples/widgets/mac/mac.pro create mode 100644 examples/widgets/mac/qmacnativewidget/main.mm create mode 100644 examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro (limited to 'examples/widgets/mac') diff --git a/examples/widgets/mac/mac.pro b/examples/widgets/mac/mac.pro new file mode 100644 index 0000000000..c5f8bf826f --- /dev/null +++ b/examples/widgets/mac/mac.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs +macx { + SUBDIRS = \ + qmacnativewidget +} \ No newline at end of file diff --git a/examples/widgets/mac/qmacnativewidget/main.mm b/examples/widgets/mac/qmacnativewidget/main.mm new file mode 100644 index 0000000000..28cf2adc3b --- /dev/null +++ b/examples/widgets/mac/qmacnativewidget/main.mm @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#import + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class RedWidget : public QWidget +{ +public: + RedWidget() { + + } + + void resizeEvent(QResizeEvent *) + { + qDebug() << "RedWidget::resize" << size(); + } + + void paintEvent(QPaintEvent *event) + { + QPainter p(this); + Q_UNUSED(event); + QRect rect(QPoint(0, 0), size()); + qDebug() << "Painting geometry" << rect; + p.fillRect(rect, QColor(133, 50, 50)); + } +}; + +namespace { +int qtArgc = 0; +char **qtArgv; +QApplication *qtApp = 0; +} + +@interface WindowCreator : NSObject {} +- (void)createWindow; +@end + +@implementation WindowCreator +- (void)createWindow { + // Qt widgets rely on a QApplication being alive somewhere + qtApp = new QApplication(qtArgc, qtArgv); + + // Create the NSWindow + NSRect frame = NSMakeRect(500, 500, 500, 500); + NSWindow* window = [[NSWindow alloc] initWithContentRect:frame + styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask + backing:NSBackingStoreBuffered + defer:NO]; + [window setTitle:@"NSWindow"]; + + // Create widget hierarchy with QPushButton and QLineEdit + QMacNativeWidget *nativeWidget = new QMacNativeWidget(); + // Get the NSView for QMacNativeWidget and set it as the content view for the NSWindow + [window setContentView:nativeWidget->nativeView()]; + + QHBoxLayout *hlayout = new QHBoxLayout(); + hlayout->addWidget(new QPushButton("Push", nativeWidget)); + hlayout->addWidget(new QLineEdit(nativeWidget)); + + QVBoxLayout *vlayout = new QVBoxLayout(); + vlayout->addLayout(hlayout); + + //RedWidget * redWidget = new RedWidget; + //vlayout->addWidget(redWidget); + + nativeWidget->setLayout(vlayout); + + + // show() must be called on nativeWiget to get the widgets int he correct state. + nativeWidget->show(); + + // Show the NSWindow + [window makeKeyAndOrderFront:NSApp]; +} +@end + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + // Normally, we would use the application delegate. + // We resort to the notification mechanism for conciseness. + WindowCreator *windowCreator= [WindowCreator alloc]; + [[NSNotificationCenter defaultCenter] + addObserver:windowCreator selector:@selector(createWindow) + name:NSApplicationDidFinishLaunchingNotification object:nil]; + + // Save these for QApplication + qtArgc = argc; + qtArgv = argv; + + // Other than the few lines above, it's business as usual... + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro b/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro new file mode 100644 index 0000000000..cafff9f035 --- /dev/null +++ b/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro @@ -0,0 +1,7 @@ +TEMPLATE = app + +OBJECTIVE_SOURCES += main.mm +LIBS += -framework Cocoa + +QT += widgets +#QT += widgets-private gui-private core-private -- cgit v1.2.3