diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-08-28 11:58:30 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2020-08-28 14:16:52 +0200 |
commit | 92a32e050fe0c545d0b7b70501c224d09f8d9ed6 (patch) | |
tree | 77cb0c2e73aae4de18ad6ddb79f1037d633b8ab7 /src/widgets/widgets | |
parent | 7fe7bd326ff692067d7349153ad274a631762dff (diff) |
Remove QMacNativeWidget and QMacCocoaViewContainer
The functionality should be available via QWidget::winId(),
and QWidget::createWindowContainer() + QWindow::fromWinId().
Any bugs in this area should be fixed by improving the general
wrapping APIs.
Fixes: QTBUG-83254
Change-Id: I86584a4a8138d17d65a50da39efd58039f10da91
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r-- | src/widgets/widgets/qmaccocoaviewcontainer_mac.h | 70 | ||||
-rw-r--r-- | src/widgets/widgets/qmaccocoaviewcontainer_mac.mm | 199 | ||||
-rw-r--r-- | src/widgets/widgets/qmacnativewidget_mac.h | 69 | ||||
-rw-r--r-- | src/widgets/widgets/qmacnativewidget_mac.mm | 166 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 7 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu_mac.mm | 6 | ||||
-rw-r--r-- | src/widgets/widgets/widgets.pri | 8 |
7 files changed, 5 insertions, 520 deletions
diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.h b/src/widgets/widgets/qmaccocoaviewcontainer_mac.h deleted file mode 100644 index a9d075638f..0000000000 --- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QCOCOAVIEWCONTAINER_H -#define QCOCOAVIEWCONTAINER_H - -#include <QtWidgets/qtwidgetsglobal.h> -#include <QtWidgets/QWidget> - -Q_FORWARD_DECLARE_OBJC_CLASS(NSView); - -QT_BEGIN_NAMESPACE - -#if QT_DEPRECATED_SINCE(5, 15) -class QMacCocoaViewContainerPrivate; -class QT_DEPRECATED_X("Use QWindow::fromWinId and QWidget::createWindowContainer instead") -Q_WIDGETS_EXPORT QMacCocoaViewContainer : public QWidget -{ - Q_OBJECT -public: - QMacCocoaViewContainer(NSView *cocoaViewToWrap, QWidget *parent = nullptr); - virtual ~QMacCocoaViewContainer(); - - void setCocoaView(NSView *view); - NSView *cocoaView() const; - -private: - Q_DECLARE_PRIVATE(QMacCocoaViewContainer) -}; -#endif - -QT_END_NAMESPACE - -#endif // QCOCOAVIEWCONTAINER_H diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm deleted file mode 100644 index d56c6ab68b..0000000000 --- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm +++ /dev/null @@ -1,199 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#import <AppKit/AppKit.h> -#include "qmaccocoaviewcontainer_mac.h" - -#include <QtCore/QDebug> -#include <QtGui/QWindow> -#include <qpa/qplatformnativeinterface.h> -#include <private/qwidget_p.h> -#include <private/qwindow_p.h> - -/*! - \class QMacCocoaViewContainer - \since 4.5 - - \brief The QMacCocoaViewContainer class provides a widget for \macos that can be used to wrap arbitrary - Cocoa views (i.e., NSView subclasses) and insert them into Qt hierarchies. - - \ingroup advanced - \inmodule QtWidgets - - While Qt offers a lot of classes for writing your application, Apple's - Cocoa frameworks offer functionality that is not currently available (or - may never end up) in Qt. Using QMacCocoaViewContainer, it is possible to take an - arbitrary NSView-derived class from Cocoa and put it in a Qt widgets hierarchy. - Depending on the level of integration you need, you can use QMacCocoaViewContainer - directly or subclass it to wrap more functionality of the underlying NSView. - - It should be also noted that, at the Cocoa level, there is a difference - between top-level windows and views (widgets that are inside a window). - For this reason, make sure that the NSView that you are wrapping doesn't - end up as a top-level window. The best way to ensure this is to make sure - QMacCocoaViewContainer's parent widget is not null. - - If you are using QMacCocoaViewContainer as a subclass and are accessing Cocoa API, - it is probably simpler to have your file end with \tt{.mm} instead of \tt{.cpp}. - Most Apple tools will correctly identify the source as Objective-C++. - - QMacCocoaViewContainer requires knowledge of how Cocoa works, especially in - regard to its reference counting (retain/release) nature. It is noted in - the functions below if there is any change in the reference count. Cocoa - views often generate temporary objects that are released by an autorelease - pool. If this is done outside of a running event loop, it is up to the - developer to provide the autorelease pool. - - The following is a snippet showing how to subclass QMacCocoaViewContainer - to wrap an NSSearchField. - - \code - SearchWidget::SearchWidget(QWidget *parent) - : QMacCocoaViewContainer(0, parent) - { - // Many Cocoa objects create temporary autorelease objects, - // so create a pool to catch them. - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - // Create the NSSearchField, set it on the QCocoaViewContainer. - NSSearchField *search = [[NSSearchField alloc] init]; - setCocoaView(search); - - // Use a Qt menu for the search field menu. - QMenu *qtMenu = createMenu(this); - NSMenu *nsMenu = qtMenu->macMenu(0); - [[search cell] setSearchMenuTemplate:nsMenu]; - - // Release our reference, since our super class takes ownership and we - // don't need it anymore. - [search release]; - - // Clean up our pool as we no longer need it. - [pool release]; - } - \endcode -*/ - -QT_BEGIN_NAMESPACE - -class QMacCocoaViewContainerPrivate : public QWidgetPrivate -{ - QT_IGNORE_DEPRECATIONS(Q_DECLARE_PUBLIC(QMacCocoaViewContainer)) -public: - NSView *nsview; - QMacCocoaViewContainerPrivate(); - ~QMacCocoaViewContainerPrivate(); -}; - -QMacCocoaViewContainerPrivate::QMacCocoaViewContainerPrivate() - : nsview(0) -{ -} - -QMacCocoaViewContainerPrivate::~QMacCocoaViewContainerPrivate() -{ - [nsview release]; -} - -/*! - Create a new QMacCocoaViewContainer using the NSView pointer in - the \a view with parent, \a parent. QMacCocoaViewContainer will - retain the \a view. - -*/ -QMacCocoaViewContainer::QMacCocoaViewContainer(NSView *view, QWidget *parent) - : QWidget(*new QMacCocoaViewContainerPrivate, parent, {}) -{ - // Ensures that we have a QWindow, even if we're not a top level widget - setAttribute(Qt::WA_NativeWindow); - - setCocoaView(view); -} - -/*! - Destroy the QMacCocoaViewContainer and release the wrapped view. -*/ -QMacCocoaViewContainer::~QMacCocoaViewContainer() -{ - -} - -/*! - Returns the NSView that has been set on this container. -*/ -NSView *QMacCocoaViewContainer::cocoaView() const -{ - Q_D(const QMacCocoaViewContainer); - return d->nsview; -} - -/*! - Sets \a view as the NSView to contain and retains it. If this - container already had a view set, it will release the previously set view. -*/ -void QMacCocoaViewContainer::setCocoaView(NSView *view) -{ - Q_D(QMacCocoaViewContainer); - NSView *oldView = d->nsview; - [view retain]; - d->nsview = view; - - // Get rid of QWindow completely, and re-create a new vanilla one, which - // we will then re-configure to be a foreign window. - destroy(); - create(); - - // Can't use QWindow::fromWinId() here due to QWidget controlling its - // QWindow, and can't use QWidget::createWindowContainer() due to the - // QMacCocoaViewContainer class being public API instead of a factory - // function. - QWindow *window = windowHandle(); - window->destroy(); - qt_window_private(window)->create(false, WId(view)); - Q_ASSERT(window->handle()); - - [oldView release]; - - // The QWindow::destroy()) call above will explicitly hide this widget. - // Clear the hidden state here so it can be implicitly shown again. - setAttribute(Qt::WA_WState_Hidden, false); - -} - -QT_END_NAMESPACE diff --git a/src/widgets/widgets/qmacnativewidget_mac.h b/src/widgets/widgets/qmacnativewidget_mac.h deleted file mode 100644 index 751f520934..0000000000 --- a/src/widgets/widgets/qmacnativewidget_mac.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QMACNATIVEWIDGET_H -#define QMACNATIVEWIDGET_H - -#include <QtWidgets/qtwidgetsglobal.h> -#include <QtWidgets/QWidget> - -Q_FORWARD_DECLARE_OBJC_CLASS(NSView); - -QT_BEGIN_NAMESPACE - -#if QT_DEPRECATED_SINCE(5, 15) -class QT_DEPRECATED_X("Use QWidget::winId instead") -Q_WIDGETS_EXPORT QMacNativeWidget : public QWidget -{ - Q_OBJECT -public: - QMacNativeWidget(NSView *parentView = nullptr); - ~QMacNativeWidget(); - - QSize sizeHint() const override; - NSView *nativeView() const; - -protected: - bool event(QEvent *ev) override; -}; -#endif - -QT_END_NAMESPACE - -#endif // QMACNATIVEWIDGET_H diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm deleted file mode 100644 index 874ca84b61..0000000000 --- a/src/widgets/widgets/qmacnativewidget_mac.mm +++ /dev/null @@ -1,166 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/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 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#import <AppKit/AppKit.h> -#include "qmacnativewidget_mac.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 \macos that provides - a way to put Qt widgets into Cocoa hierarchies. - - \ingroup advanced - \inmodule QtWidgets - - On \macos, there is a difference between a window and view; - normally expressed as widgets in Qt. Qt makes assumptions about its - parent-child hierarchy that make it complex to put an arbitrary Qt widget - into a hierarchy of "normal" views from Apple frameworks. QMacNativeWidget - bridges the gap between views and windows and makes it possible to put a - hierarchy of Qt widgets into a non-Qt window or view. - - QMacNativeWidget pretends it is a window (i.e. isWindow() will return true), - but it cannot be shown on its own. It needs to be put into a window - when it is created or later through a native call. - - Here is an example showing how to put a QPushButton into a NSWindow: - - \snippet qmacnativewidget/main.mm 0 - - Note that QMacNativeWidget requires knowledge of Cocoa. All it - does is get the Qt hierarchy into a window not owned by Qt. It is then up - to the programmer to ensure it is placed correctly in the window and - responds correctly to events. -*/ - -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 (Q_UNLIKELY(!function)) - qWarning("Qt could not resolve function %s from " - "QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()", - functionName.constData()); - 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 a NSView pointer. -*/ -QMacNativeWidget::QMacNativeWidget(NSView *parentView) - : QWidget(0) -{ - Q_UNUSED(parentView); - - //d_func()->topData()->embedded = true; - setPalette(QPalette(Qt::transparent)); - setAttribute(Qt::WA_SetPalette, false); - setAttribute(Qt::WA_LayoutUsesWidgetRect); - setAttribute(Qt::WA_TranslucentBackground); - setAttribute(Qt::WA_NoSystemBackground, false); -} - -/*! - Destroy the QMacNativeWidget. -*/ -QMacNativeWidget::~QMacNativeWidget() -{ -} - -/*! - \reimp -*/ -QSize QMacNativeWidget::sizeHint() const -{ - // QMacNativeWidget really does not have any other choice - // than to fill its designated area. - if (windowHandle()) - return windowHandle()->size(); - return QWidget::sizeHint(); -} - -/*! - Returns the native view backing the QMacNativeWidget. - -*/ -NSView *QMacNativeWidget::nativeView() const -{ - winId(); - return getEmbeddableView(windowHandle()); -} - -/*! - \reimp -*/ -bool QMacNativeWidget::event(QEvent *ev) -{ - return QWidget::event(ev); -} - -QT_END_NAMESPACE diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index e63a7edc4a..c2ef383d28 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -50,9 +50,6 @@ #include "qlayout.h" #include "qpainter.h" #include <qpa/qplatformtheme.h> -#ifdef Q_OS_MACOS -#include "qmacnativewidget_mac.h" -#endif #include "qapplication.h" #ifndef QT_NO_ACCESSIBILITY # include "qaccessible.h" @@ -3592,8 +3589,8 @@ void QMenu::actionEvent(QActionEvent *e) if (QWidget *widget = d->widgetItems.value(wa)) { #ifdef Q_OS_MACOS QWidget *p = widget->parentWidget(); - if (p != this && QT_IGNORE_DEPRECATIONS(qobject_cast<QMacNativeWidget *>(p))) { - // This widget was reparented into a native Mac view + if (p != this) { + // This widget was reparented into a container widget // (see QMenuPrivate::moveWidgetToPlatformItem). // Reset the parent and delete the native widget. widget->setParent(this); diff --git a/src/widgets/widgets/qmenu_mac.mm b/src/widgets/widgets/qmenu_mac.mm index 1be74bf27c..782676a4cf 100644 --- a/src/widgets/widgets/qmenu_mac.mm +++ b/src/widgets/widgets/qmenu_mac.mm @@ -49,7 +49,6 @@ QT_USE_NAMESPACE #include "qmenubar.h" #include "qmenubar_p.h" #endif -#include "qmacnativewidget_mac.h" #include <QtCore/QDebug> #include <QtGui/QGuiApplication> @@ -125,13 +124,14 @@ void QMenu::setAsDockMenu() void QMenuPrivate::moveWidgetToPlatformItem(QWidget *widget, QPlatformMenuItem* item) { - auto *container = new QT_IGNORE_DEPRECATIONS(QMacNativeWidget); + auto *container = new QWidget; + container->setAttribute(Qt::WA_TranslucentBackground); QObject::connect(platformMenu, SIGNAL(destroyed()), container, SLOT(deleteLater())); container->resize(widget->sizeHint()); widget->setParent(container); widget->setVisible(true); - NSView *containerView = container->nativeView(); + NSView *containerView = reinterpret_cast<NSView*>(container->winId()); QWindow *containerWindow = container->windowHandle(); Qt::WindowFlags wf = containerWindow->flags(); containerWindow->setFlags(wf | Qt::SubWindow); diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri index 55804c5aaf..3caf2912f9 100644 --- a/src/widgets/widgets/widgets.pri +++ b/src/widgets/widgets/widgets.pri @@ -357,14 +357,6 @@ qtConfig(widgettextcontrol) { } macx { - HEADERS += \ - widgets/qmacnativewidget_mac.h \ - widgets/qmaccocoaviewcontainer_mac.h - - OBJECTIVE_SOURCES += \ - widgets/qmacnativewidget_mac.mm \ - widgets/qmaccocoaviewcontainer_mac.mm - qtConfig(menu)|qtConfig(menubar) { SOURCES += widgets/qmenu_mac.mm } |