On this page
QMacNativeWidget Class
The QMacNativeWidget class provides a widget for macOS that provides a way to put Qt widgets into Cocoa hierarchies. More...
Header: | #include <QMacNativeWidget> |
qmake: | QT += widgets |
Since: | Qt 4.5 |
Inherits: | QWidget |
This class was introduced in Qt 4.5.
Public Functions
QMacNativeWidget(NSView *parentView = nullptr) | |
virtual | ~QMacNativeWidget() |
NSView * | nativeView() const |
Reimplemented Public Functions
virtual QSize | sizeHint() const override |
Reimplemented Protected Functions
virtual bool | event(QEvent *ev) override |
Detailed Description
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:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(200, app.desktop()->height() - 200, 239, 200)
styleMask:NSTitledWindowMask | NSClosableWindowMask
| NSMiniaturizableWindowMask | NSResizableWindowMask
backing:NSBackingStoreBuffered defer:NO];
QMacNativeWidget *nativeWidget = new QMacNativeWidget();
nativeWidget->move(0, 0);
nativeWidget->setPalette(QPalette(Qt::red));
nativeWidget->setAutoFillBackground(true);
QVBoxLayout *layout = new QVBoxLayout();
QPushButton *pushButton = new QPushButton("An Embedded Qt Button!", nativeWidget);
pushButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // Don't use the layout rect calculated from QMacStyle.
layout->addWidget(pushButton);
nativeWidget->setLayout(layout);
// Adjust Cocoa layouts
NSView *nativeWidgetView = reinterpret_cast<NSView *>(nativeWidget->winId());
NSView *contentView = [window contentView];
[contentView setAutoresizesSubviews:YES];
[nativeWidgetView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[nativeWidgetView setAutoresizesSubviews:YES];
NSView *pushButtonView = reinterpret_cast<NSView *>(pushButton->winId());
[pushButtonView setAutoresizingMask:NSViewWidthSizable];
// Add the nativeWidget to the window.
[contentView addSubview:nativeWidgetView positioned:NSWindowAbove relativeTo:nil];
nativeWidget->show();
pushButton->show();
// Show the window.
[window makeKeyAndOrderFront:window];
[pool release];
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.
Member Function Documentation
QMacNativeWidget::QMacNativeWidget(NSView *parentView = nullptr)
Create a QMacNativeWidget with parentView as its "superview" (i.e., parent). The parentView is a NSView pointer.
[virtual]
QMacNativeWidget::~QMacNativeWidget()
Destroy the QMacNativeWidget.
[override virtual protected]
bool QMacNativeWidget::event(QEvent *ev)
Reimplements: QWidget::event(QEvent *event).
NSView *QMacNativeWidget::nativeView() const
Returns the native view backing the QMacNativeWidget.
[override virtual]
QSize QMacNativeWidget::sizeHint() const
Reimplements an access function for property: QWidget::sizeHint.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qmacnativewidget.html