diff options
author | Morten Johan Sørvig <morten.sorvig@digia.com> | 2013-09-02 13:49:24 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-23 07:18:27 +0200 |
commit | 68b42cd595954b3c1579e30907dc78c181f0701c (patch) | |
tree | 4a4283afcaec0ca7fffe3c1063533d4ec56c9b8d /src/widgets | |
parent | f370f77e48a06464af12d74d2ccb093c130726ed (diff) |
Port QMacCocoaViewContainer to Qt 5.
Includes example.
Change-Id: Ifdda5c535d0ec41694712405d921b2c32cb8dfc8
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/widgets/qmaccocoaviewcontainer_mac.h | 10 | ||||
-rw-r--r-- | src/widgets/widgets/qmaccocoaviewcontainer_mac.mm | 59 | ||||
-rw-r--r-- | src/widgets/widgets/widgets.pri | 12 |
3 files changed, 52 insertions, 29 deletions
diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.h b/src/widgets/widgets/qmaccocoaviewcontainer_mac.h index b89b796819..31172cb6bb 100644 --- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.h +++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.h @@ -44,20 +44,20 @@ #include <QtWidgets/QWidget> -QT_BEGIN_NAMESPACE +Q_FORWARD_DECLARE_OBJC_CLASS(NSView); +QT_BEGIN_NAMESPACE class QMacCocoaViewContainerPrivate; - class Q_WIDGETS_EXPORT QMacCocoaViewContainer : public QWidget { Q_OBJECT public: - QMacCocoaViewContainer(void *cocoaViewToWrap, QWidget *parent = 0); + QMacCocoaViewContainer(NSView *cocoaViewToWrap, QWidget *parent = 0); virtual ~QMacCocoaViewContainer(); - void setCocoaView(void *cocoaViewToWrap); - void *cocoaView() const; + void setCocoaView(NSView *view); + NSView *cocoaView() const; private: Q_DECLARE_PRIVATE(QMacCocoaViewContainer) diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm index 2be11f34d5..a94273c574 100644 --- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm +++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm @@ -40,9 +40,12 @@ ****************************************************************************/ #import <Cocoa/Cocoa.h> -#include <private/qwidget_p.h> #include "qmaccocoaviewcontainer_mac.h" -#include <private/qt_mac_p.h> + +#include <QtCore/QDebug> +#include <QtGui/QWindow> +#include <qpa/qplatformnativeinterface.h> +#include <private/qwidget_p.h> /*! \class QMacCocoaViewContainer @@ -91,6 +94,20 @@ QT_BEGIN_NAMESPACE +namespace { +// TODO use QtMacExtras copy of this function when available. +inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePlatformFunction(const QByteArray &functionName) +{ + QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); + QPlatformNativeInterface::NativeResourceForIntegrationFunction function = + nativeInterface->nativeResourceFunctionForIntegration(functionName); + if (!function) + qWarning() << "Qt could not resolve function" << functionName + << "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()"; + return function; +} +} //namespsace + class QMacCocoaViewContainerPrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QMacCocoaViewContainer) @@ -111,20 +128,22 @@ QMacCocoaViewContainerPrivate::~QMacCocoaViewContainerPrivate() } /*! - \fn QMacCocoaViewContainer::QMacCocoaViewContainer(void *cocoaViewToWrap, QWidget *parent) + \fn QMacCocoaViewContainer::QMacCocoaViewContainer(NSView *cocoaViewToWrap, QWidget *parent) Create a new QMacCocoaViewContainer using the NSView pointer in \a cocoaViewToWrap with parent, \a parent. QMacCocoaViewContainer will retain \a cocoaViewToWrap. - \a cocoaViewToWrap is a void pointer that allows the header to be included - with C++ source. */ -QMacCocoaViewContainer::QMacCocoaViewContainer(void *cocoaViewToWrap, QWidget *parent) +QMacCocoaViewContainer::QMacCocoaViewContainer(NSView *view, QWidget *parent) : QWidget(*new QMacCocoaViewContainerPrivate, parent, 0) { - if (cocoaViewToWrap) - setCocoaView(cocoaViewToWrap); + + if (view) + setCocoaView(view); + + // QMacCocoaViewContainer requires a native window handle. + setAttribute(Qt::WA_NativeWindow); } /*! @@ -132,33 +151,37 @@ QMacCocoaViewContainer::QMacCocoaViewContainer(void *cocoaViewToWrap, QWidget *p */ QMacCocoaViewContainer::~QMacCocoaViewContainer() { + } /*! - Returns the NSView that has been set on this container. The returned view - has been autoreleased, so you will need to retain it if you want to make - use of it. + Returns the NSView that has been set on this container. */ -void *QMacCocoaViewContainer::cocoaView() const +NSView *QMacCocoaViewContainer::cocoaView() const { Q_D(const QMacCocoaViewContainer); - return [[d->nsview retain] autorelease]; + return d->nsview; } /*! Sets the NSView to contain to be \a cocoaViewToWrap and retains it. If this container already had a view set, it will release the previously set view. */ -void QMacCocoaViewContainer::setCocoaView(void *cocoaViewToWrap) +void QMacCocoaViewContainer::setCocoaView(NSView *view) { Q_D(QMacCocoaViewContainer); - QMacCocoaAutoReleasePool pool; - NSView *view = static_cast<NSView *>(cocoaViewToWrap); NSView *oldView = d->nsview; - destroy(true, true); [view retain]; d->nsview = view; - create(WId(d->nsview), false, true); + + // Create window and platformwindow + winId(); + QPlatformWindow *platformWindow = this->windowHandle()->handle(); + + // Set the new view as the content view for the window. + typedef void (*SetWindowContentViewFunction)(QPlatformWindow *window, NSView *nsview); + reinterpret_cast<SetWindowContentViewFunction>(resolvePlatformFunction("setwindowcontentview"))(platformWindow, view); + [oldView release]; } diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri index 027654078f..a35e6eb3a1 100644 --- a/src/widgets/widgets/widgets.pri +++ b/src/widgets/widgets/widgets.pri @@ -143,21 +143,21 @@ SOURCES += \ macx { HEADERS += \ - widgets/qmacnativewidget_mac.h + widgets/qmacnativewidget_mac.h \ + widgets/qmaccocoaviewcontainer_mac.h OBJECTIVE_SOURCES += \ widgets/qmenu_mac.mm \ - widgets/qmacnativewidget_mac.mm + widgets/qmacnativewidget_mac.mm \ + widgets/qmaccocoaviewcontainer_mac.mm } # TODO false:mac { - HEADERS += widgets/qmaccocoaviewcontainer_mac.h OBJECTIVE_HEADERS += widgets/qcocoatoolbardelegate_mac_p.h \ widgets/qcocoamenu_mac_p.h - OBJECTIVE_SOURCES += widgets/qmaccocoaviewcontainer_mac.mm \ - widgets/qcocoatoolbardelegate_mac.mm \ - widgets/qmainwindowlayout_mac.mm \ + OBJECTIVE_SOURCES += widgets/qcocoatoolbardelegate_mac.mm \ + widgets/qmainwindowlayout_mac.mm } |