diff options
author | Morten Johan Sørvig <morten.sorvig@digia.com> | 2013-09-02 12:41:50 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-23 07:18:24 +0200 |
commit | f370f77e48a06464af12d74d2ccb093c130726ed (patch) | |
tree | eb8a867ce53013922fdfe00c85b1a7c48c449afa /src/widgets/widgets/qmacnativewidget_mac.mm | |
parent | 05cd06cff378cecec071a2aa6f7cb4ee97a9ea6f (diff) |
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 <liang.qi@digia.com>
Diffstat (limited to 'src/widgets/widgets/qmacnativewidget_mac.mm')
-rw-r--r-- | src/widgets/widgets/qmacnativewidget_mac.mm | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm index 50907b8dfc..1d36c389a6 100644 --- a/src/widgets/widgets/qmacnativewidget_mac.mm +++ b/src/widgets/widgets/qmacnativewidget_mac.mm @@ -40,15 +40,18 @@ ****************************************************************************/ #import <Cocoa/Cocoa.h> -#import <private/qcocoaview_mac_p.h> #include "qmacnativewidget_mac.h" -#include <private/qwidget_p.h> + +#include <QtCore/qdebug.h> +#include <QtGui/qwindow.h> +#include <QtGui/qguiapplication.h> +#include <qpa/qplatformnativeinterface.h> /*! \class QMacNativeWidget \since 4.5 - \brief The QMacNativeWidget class provides a widget for Mac OS X that provides a way to put Qt widgets into Carbon - or Cocoa hierarchies depending on how Qt was configured. + \brief The QMacNativeWidget class provides a widget for Mac OS X that provides + a way to put Qt widgets into Cocoa hierarchies. \ingroup advanced \inmodule QtWidgets @@ -80,26 +83,47 @@ QT_BEGIN_NAMESPACE -class QMacNativeWidgetPrivate : public QWidgetPrivate +namespace { +// TODO use QtMacExtras copy of this function when available. +inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePlatformFunction(const QByteArray &functionName) { -}; - -extern OSViewRef qt_mac_create_widget(QWidget *widget, QWidgetPrivate *widgetPrivate, OSViewRef parent); + 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 +NSView *getEmbeddableView(QWindow *qtWindow) +{ + // Make sure the platform window is created + qtWindow->create(); + + // Inform the window that it's a subwindow of a non-Qt window. This must be + // done after create() because we need to have a QPlatformWindow instance. + // The corresponding NSWindow will not be shown and can be deleted later. + typedef void (*SetEmbeddedInForeignViewFunction)(QPlatformWindow *window, bool embedded); + reinterpret_cast<SetEmbeddedInForeignViewFunction>(resolvePlatformFunction("setEmbeddedInForeignView"))(qtWindow->handle(), true); + + // Get the Qt content NSView for the QWindow from the Qt platform plugin + QPlatformNativeInterface *platformNativeInterface = QGuiApplication::platformNativeInterface(); + NSView *qtView = (NSView *)platformNativeInterface->nativeResourceForWindow("nsview", qtWindow); + return qtView; // qtView is ready for use. +} /*! Create a QMacNativeWidget with \a parentView as its "superview" (i.e., - parent). The \a parentView is either an HIViewRef if Qt is using Carbon or - a NSView pointer if Qt is using Cocoa. + parent). The \a parentView is a NSView pointer. */ -QMacNativeWidget::QMacNativeWidget(void *parentView) - : QWidget(*new QMacNativeWidgetPrivate, 0, Qt::Window) +QMacNativeWidget::QMacNativeWidget(NSView *parentView) + : QWidget(0) { - Q_D(QMacNativeWidget); - OSViewRef myView = qt_mac_create_widget(this, d, OSViewRef(parentView)); + Q_UNUSED(parentView); - d->topData()->embedded = true; - create(WId(myView), false, false); + //d_func()->topData()->embedded = true; setPalette(QPalette(Qt::transparent)); setAttribute(Qt::WA_SetPalette, false); setAttribute(Qt::WA_LayoutUsesWidgetRect); @@ -117,8 +141,19 @@ QMacNativeWidget::~QMacNativeWidget() */ QSize QMacNativeWidget::sizeHint() const { - return QSize(200, 200); + // QMacNativeWidget really does not have any other choice + // than to fill its designated area. + if (windowHandle()) + return windowHandle()->size(); + return QWidget::sizeHint(); } + +NSView *QMacNativeWidget::nativeView() const +{ + winId(); + return getEmbeddableView(windowHandle()); +} + /*! \reimp */ |