Embed a QQuickView in a Cocoa View
-
Hi,
Despite a lot of time spent on trying to solve that issue, I can't embed cleanly a QQuickView in a Cocoa View.
the Cocoa view is created by a host, which gives me a NSView*, and I want to create a qml GUI, with a QQuickView.I explored 2 solution :
solution 1 :
parent_window = QWindow::fromWinId(WId(parent_view));
quick_view = new QQuickView(parent_window);
quick_view->show();in that case , the parent window remains empty, and a new window is created with the qml view
solution 2 :
NSView parentView = reinterpret_cast<NSView >(parent_view);
NSView quickView = reinterpret_cast<NSView >(quick_view->winId());
[parentView addSubview:quickView positioned:NSWindowAbove relativeTo:nil];in that case, the qml shows in the parent window, but an empty window is created anyway.
Did somenone succed in having that done properly, which means displaying the qml in the parent window, without creating a useless window ?
-
Hi and welcome to devnet,
I haven't tested it with your use case however QMacNativeWidget might be of interest.
Hope it helps
-
What do you mean by
buggy in c++
? You need to do some Objective-C++ in order to use that class. -
Can you share the code that you are using ?
-
Hi,
the last code I am using is the following :in the .cpp file :
QQuickWidget* quickWidget = new QQuickWidget(); [...] createMacView(inParent, quickWidget);
in the .mm file :
void createMacView(void* inView, QQuickWidget* inQuickWidget) { QMacNativeWidget *nativeWidget = new QMacNativeWidget(); nativeWidget->move(0, 0); nativeWidget->setPalette(QPalette(Qt::black)); nativeWidget->setAutoFillBackground(true); QVBoxLayout* layout = new QVBoxLayout(); inQuickWidget->setAttribute(Qt::WA_LayoutUsesWidgetRect); layout->addWidget(inQuickWidget); nativeWidget->setLayout(layout); // Adjust Cocoa layouts NSView *nativeWidgetView = reinterpret_cast<NSView *>(nativeWidget->winId()); NSView *contentView = reinterpret_cast<NSView *>(inView); [nativeWidgetView setFrame: NSMakeRect (0, 0, inQuickWidget->geometry().width(), inQuickWidget->geometry().height())]; // Add the nativeWidget to the window. [contentView addSubview:nativeWidgetView positioned:NSWindowAbove relativeTo:nil]; nativeWidget->show(); inQuickWidget->show(); }
In that case, the qml is displayed on the host window, but a useless windows is created anyway (we can see its "close / minimize / maximize" bar at 0,0)
-
Can you also provide a main.cpp file ?
This will allow to re-create the same conditions you have.