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 |
QMacNativeWidget(NSView *parentView = nullptr) | |
virtual | ~QMacNativeWidget() |
NSView * | nativeView() const |
virtual QSize | sizeHint() const override |
virtual bool | event(QEvent *ev) override |
The QMacNativeWidget class provides a widget for macOS that provides a way to put Qt widgets into Cocoa hierarchies.
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.
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)Reimplemented from QWidget::event().
Returns the native view backing the QMacNativeWidget.
[override virtual]
QSize QMacNativeWidget::sizeHint() constReimplemented from QWidget::sizeHint().