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 | |
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')
-rw-r--r-- | src/widgets/widgets/qmacnativewidget_mac.h | 7 | ||||
-rw-r--r-- | src/widgets/widgets/qmacnativewidget_mac.mm | 69 | ||||
-rw-r--r-- | src/widgets/widgets/widgets.pri | 11 |
3 files changed, 64 insertions, 23 deletions
diff --git a/src/widgets/widgets/qmacnativewidget_mac.h b/src/widgets/widgets/qmacnativewidget_mac.h index 796d7b38d4..dd433a4ee3 100644 --- a/src/widgets/widgets/qmacnativewidget_mac.h +++ b/src/widgets/widgets/qmacnativewidget_mac.h @@ -44,20 +44,23 @@ #include <QtWidgets/QWidget> -QT_BEGIN_NAMESPACE +Q_FORWARD_DECLARE_OBJC_CLASS(NSView); +QT_BEGIN_NAMESPACE class QMacNativeWidgetPrivate; class Q_WIDGETS_EXPORT QMacNativeWidget : public QWidget { Q_OBJECT public: - QMacNativeWidget(void *parentRef = 0); + QMacNativeWidget(NSView *parentView = 0); ~QMacNativeWidget(); QSize sizeHint() const; + NSView *nativeView() const; protected: + void init(NSView *parentView); bool event(QEvent *ev); private: 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 */ diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri index e130827905..027654078f 100644 --- a/src/widgets/widgets/widgets.pri +++ b/src/widgets/widgets/widgets.pri @@ -142,20 +142,23 @@ SOURCES += \ widgets/qplaintextedit.cpp macx { + HEADERS += \ + widgets/qmacnativewidget_mac.h + OBJECTIVE_SOURCES += \ - widgets/qmenu_mac.mm + widgets/qmenu_mac.mm \ + widgets/qmacnativewidget_mac.mm } # TODO false:mac { - HEADERS += widgets/qmacnativewidget_mac.h \ - widgets/qmaccocoaviewcontainer_mac.h + 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 \ - widgets/qmacnativewidget_mac.mm \ + } wince*: { |