qtdeclarative/tests/manual/windowembedding/main.cpp

108 lines
3.0 KiB
C++
Raw Normal View History

Add preliminary support for embedding QWindows into Qt Quick The new WindowContainer item allows embedding arbitrary windows into the Qt Quick scene, including foreign windows such as native map or web views. A new parent property is also added to Window, allowing these to be embedded inside other Items without the need for an explicit window container, along with a new z property, allowing modifications to the child Window's stacking order. Splitting the Quick document up into child windows allows interesting use-cases, such as setting a different surface format on the child window, for example for enabling HDR without affecting the rest of the UI. The embedded windows are managed as a child windows of the root QQuickWindow, with positioning, sizing, and stacking order reflecting the implicit or explicit window container item. Clipping is also supported, by setting a mask on the embedded window. The advantage of managing all embedded windows as as children of the root window is that we always have a QQuickWindow to handle the stacking order, we're not limited by the platform surface clip, and don't risk being interleaved behind native parts of the window we embed into that we don’t control. [ChangeLog[Quick] Preliminary support for embedding QWindows into the Qt Quick scene has been added, along with a parent property on Window, to allow setting a visual parent of the Window. Task-number: QTBUG-102835 Change-Id: I78b973e2685fb0ebbc850a110712f3e747bfe09a Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
2023-11-27 16:57:00 +00:00
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtGui>
#include <QtWidgets>
#include <QQmlEngine>
#include <QQuickView>
#include <QQmlContext>
class TestWindow : public QRasterWindow
{
public:
using QRasterWindow::QRasterWindow;
TestWindow(const QBrush &brush) : m_brush(brush) {}
protected:
void mousePressEvent(QMouseEvent *) override
{
m_pressed = true;
update();
}
void mouseReleaseEvent(QMouseEvent *) override
{
m_pressed = false;
update();
}
void paintEvent(QPaintEvent *event) override
{
QPainter painter(this);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(event->rect(), m_pressed ? QGradient(QGradient::JuicyPeach) : m_brush);
}
private:
QBrush m_brush = QGradient(QGradient::DustyGrass);
bool m_pressed = false;
};
#ifdef Q_OS_APPLE
#include <WebKit/WebKit.h>
#include <MapKit/MapKit.h>
#include <AVKit/AVKit.h>
#endif
int main(int argc, char* argv[])
{
QApplication app(argc,argv);
app.setOrganizationName("QtProject");
app.setOrganizationDomain("qt-project.org");
app.setApplicationName(QFileInfo(app.applicationFilePath()).baseName());
QQuickView view;
view.connect(view.engine(), &QQmlEngine::quit, &app, &QCoreApplication::quit);
#ifdef Q_OS_MACOS
view.engine()->addImportPath(app.applicationDirPath() + QStringLiteral("/../PlugIns"));
#endif
TestWindow testWindow;
QWindow *mapWindow = nullptr;
QWindow *webViewWindow = nullptr;
QWindow *videoWindow = nullptr;
#ifdef Q_OS_APPLE
auto *webView = [WKWebView new];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.qt.io"]]];
webViewWindow = QWindow::fromWinId(WId(webView));
auto *mapView = [MKMapView new];
mapWindow = QWindow::fromWinId(WId(mapView));
# ifndef Q_OS_IOS
auto *videoView = [AVPlayerView new];
videoView.player = [AVPlayer playerWithURL:[NSURL URLWithString:
@"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"]];
videoWindow = QWindow::fromWinId(WId(videoView));
# endif
#else
mapWindow = &testWindow;
webViewWindow = &testWindow;
videoWindow = &testWindow;
#endif
auto *calendarWidget = new QCalendarWidget;
calendarWidget->setAttribute(Qt::WA_NativeWindow);
QWindow *widgetWindow = calendarWidget->windowHandle();
auto *context = view.engine()->rootContext();
context->setContextProperty("testWindow", &testWindow);
context->setContextProperty("widgetWindow", widgetWindow);
context->setContextProperty("mapWindow", mapWindow);
context->setContextProperty("webViewWindow", webViewWindow);
context->setContextProperty("videoWindow", videoWindow);
view.setSource(QUrl("qrc:/qt/qml/windowembeddingexample/windowembedding.qml"));
if (view.status() == QQuickView::Error)
return -1;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.show();
return app.exec();
}