diff options
Diffstat (limited to 'examples/quick/quickwidgets')
8 files changed, 66 insertions, 39 deletions
diff --git a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/CMakeLists.txt b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/CMakeLists.txt index 14813bc9ec..aa1cd2f0cc 100644 --- a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/CMakeLists.txt +++ b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/CMakeLists.txt @@ -1,18 +1,12 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(qquickwidgetversuswindow_opengl LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/quick/quickwidgets/qquickwidgetversuswindow_opengl") - find_package(Qt6 REQUIRED COMPONENTS Core Gui Quick QuickWidgets ShaderTools Widgets) -qt_standard_project_setup() +qt_standard_project_setup(REQUIRES 6.5) qt_add_executable(qquickwidgetversuswindow_opengl WIN32 @@ -24,11 +18,11 @@ qt_add_executable(qquickwidgetversuswindow_opengl ) target_link_libraries(qquickwidgetversuswindow_opengl PRIVATE - Qt::Core - Qt::Gui - Qt::Quick - Qt::QuickWidgets - Qt::Widgets + Qt6::Core + Qt6::Gui + Qt6::Quick + Qt6::QuickWidgets + Qt6::Widgets ) qt_add_qml_module(qquickwidgetversuswindow_opengl @@ -48,7 +42,16 @@ qt6_add_shaders(qquickwidgetversuswindow_opengl "shaders" ) install(TARGETS qquickwidgetversuswindow_opengl - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_qml_app_script( + TARGET qquickwidgetversuswindow_opengl + OUTPUT_SCRIPT deploy_script + MACOS_BUNDLE_POST_BUILD + NO_UNSUPPORTED_PLATFORM_ERROR + DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM ) +install(SCRIPT ${deploy_script}) diff --git a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/doc/src/qquickwidgetversuswindow_opengl.qdoc b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/doc/src/qquickwidgetversuswindow_opengl.qdoc index 001d19f4e6..ced0eb2d34 100644 --- a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/doc/src/qquickwidgetversuswindow_opengl.qdoc +++ b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/doc/src/qquickwidgetversuswindow_opengl.qdoc @@ -5,6 +5,7 @@ \title QQuickWidget - QQuickView Comparison Example \example quickwidgets/qquickwidgetversuswindow_opengl \brief Demonstrates the benefits of QQuickWidget over a QQuickView embedded as a native window. + \examplecategory {User Interface Components} \image qquickwidgetversuswindow-opengl-example.jpg The example allows showing the same Qt Quick scene within the same diff --git a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/main.cpp b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/main.cpp index 8c95775577..8d8e4236b9 100644 --- a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/main.cpp +++ b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/main.cpp @@ -9,8 +9,6 @@ int main(int argc, char **argv) { - qputenv("QML_BAD_GUI_RENDER_LOOP", "1"); // QTBUG-39507 - QApplication app(argc, argv); // this example and QQuickWidget are only functional when rendering with OpenGL diff --git a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/wobble.frag b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/wobble.frag index 9fddf1a162..6aadad661f 100644 --- a/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/wobble.frag +++ b/examples/quick/quickwidgets/qquickwidgetversuswindow_opengl/wobble.frag @@ -1,3 +1,6 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + #version 440 layout(location = 0) in vec2 qt_TexCoord0; diff --git a/examples/quick/quickwidgets/quickwidget/CMakeLists.txt b/examples/quick/quickwidgets/quickwidget/CMakeLists.txt index ceb8b39da1..7a878a2b28 100644 --- a/examples/quick/quickwidgets/quickwidget/CMakeLists.txt +++ b/examples/quick/quickwidgets/quickwidget/CMakeLists.txt @@ -1,18 +1,12 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(quickwidget LANGUAGES CXX) -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/quick/quickwidgets/quickwidget") - find_package(Qt6 REQUIRED COMPONENTS Core Gui Quick QuickWidgets Widgets) -qt_standard_project_setup() +qt_standard_project_setup(REQUIRES 6.5) qt_add_executable(quickwidget WIN32 @@ -21,11 +15,11 @@ qt_add_executable(quickwidget ) target_link_libraries(quickwidget PRIVATE - Qt::Core - Qt::Gui - Qt::Quick - Qt::QuickWidgets - Qt::Widgets + Qt6::Core + Qt6::Gui + Qt6::Quick + Qt6::QuickWidgets + Qt6::Widgets ) qt_add_qml_module(quickwidget @@ -37,7 +31,16 @@ qt_add_qml_module(quickwidget ) install(TARGETS quickwidget - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_qml_app_script( + TARGET quickwidget + OUTPUT_SCRIPT deploy_script + MACOS_BUNDLE_POST_BUILD + NO_UNSUPPORTED_PLATFORM_ERROR + DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM ) +install(SCRIPT ${deploy_script}) diff --git a/examples/quick/quickwidgets/quickwidget/doc/src/quickwidget.qdoc b/examples/quick/quickwidgets/quickwidget/doc/src/quickwidget.qdoc index 285acc5802..0a80b32c4a 100644 --- a/examples/quick/quickwidgets/quickwidget/doc/src/quickwidget.qdoc +++ b/examples/quick/quickwidgets/quickwidget/doc/src/quickwidget.qdoc @@ -5,6 +5,8 @@ \title Qt Quick Widgets Example \example quickwidgets/quickwidget \brief Demonstrates how to mix QML with a Qt Widgets application using the QQuickWidget class. + \examplecategory {User Interface Components} + \image qtquickwidgets-example.png */ diff --git a/examples/quick/quickwidgets/quickwidget/main.cpp b/examples/quick/quickwidgets/quickwidget/main.cpp index ecac279a2f..f8e0b78844 100644 --- a/examples/quick/quickwidgets/quickwidget/main.cpp +++ b/examples/quick/quickwidgets/quickwidget/main.cpp @@ -63,14 +63,22 @@ MainWindow::MainWindow() setCentralWidget(centralWidget); QMenu *fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(tr("Grab framebuffer"), this, &MainWindow::grabFramebuffer); - fileMenu->addAction(tr("Render to pixmap"), this, &MainWindow::renderToPixmap); - fileMenu->addAction(tr("Grab via grabToImage"), this, &MainWindow::grabToImage); + auto grabAction = fileMenu->addAction(tr("Grab framebuffer"), this, &MainWindow::grabFramebuffer); + auto renderAction = fileMenu->addAction(tr("Render to pixmap"), this, &MainWindow::renderToPixmap); + auto grabToImageAction = fileMenu->addAction(tr("Grab via grabToImage"), this, &MainWindow::grabToImage); fileMenu->addAction(tr("Quit"), qApp, &QCoreApplication::quit); QMenu *windowMenu = menuBar()->addMenu(tr("&Window")); windowMenu->addAction(tr("Add tab widget"), this, [this, centralWidget] { createQuickWidgetsInTabs(centralWidget); }); + + connect(m_quickWidget, &QObject::destroyed, this, + [this, grabAction, renderAction, grabToImageAction] { + m_quickWidget = nullptr; + grabAction->setEnabled(false); + renderAction->setEnabled(false); + grabToImageAction->setEnabled(false); + }); } void MainWindow::createQuickWidgetsInTabs(QMdiArea *mdiArea) @@ -104,10 +112,12 @@ void MainWindow::createQuickWidgetsInTabs(QMdiArea *mdiArea) if (widget->parent()) { widget->setAttribute(Qt::WA_DeleteOnClose, true); widget->setParent(nullptr); + connect(this, &QObject::destroyed, widget, &QWidget::close); widget->show(); btn->setText(msgFromTopLevel); } else { widget->setAttribute(Qt::WA_DeleteOnClose, false); + disconnect(this, &QObject::destroyed, widget, &QWidget::close); tabWidget->addTab(widget, widget->windowTitle()); btn->setText(msgToTopLevel); } @@ -123,6 +133,7 @@ void MainWindow::quickWidgetStatusChanged(QQuickWidget::Status status) { if (status == QQuickWidget::Error) { QStringList errors; + Q_ASSERT(m_quickWidget); const auto widgetErrors = m_quickWidget->errors(); for (const QQmlError &error : widgetErrors) errors.append(error.toString()); @@ -147,12 +158,14 @@ template<class T> void saveToFile(QWidget *parent, T *saveable) void MainWindow::grabFramebuffer() { + Q_ASSERT(m_quickWidget); QImage image = m_quickWidget->grabFramebuffer(); saveToFile(this, &image); } void MainWindow::renderToPixmap() { + Q_ASSERT(m_quickWidget); QPixmap pixmap(m_quickWidget->size()); m_quickWidget->render(&pixmap); saveToFile(this, &pixmap); @@ -165,6 +178,7 @@ void MainWindow::grabToImage() fd.setDefaultSuffix("png"); fd.selectFile("test_grabToImage.png"); if (fd.exec() == QDialog::Accepted) { + Q_ASSERT(m_quickWidget); QMetaObject::invokeMethod(m_quickWidget->rootObject(), "performLayerBasedGrab", Q_ARG(QVariant, fd.selectedFiles().first())); } @@ -189,8 +203,9 @@ int main(int argc, char **argv) optMultipleSample = parser.isSet(multipleSampleOption); - MainWindow mainWindow; - mainWindow.show(); + MainWindow *mainWindow = new MainWindow; + mainWindow->setAttribute(Qt::WA_DeleteOnClose, true); + mainWindow->show(); return app.exec(); } diff --git a/examples/quick/quickwidgets/quickwidget/rotatingsquare.qml b/examples/quick/quickwidgets/quickwidget/rotatingsquare.qml index 355c02f0cd..7fdc1978ce 100644 --- a/examples/quick/quickwidgets/quickwidget/rotatingsquare.qml +++ b/examples/quick/quickwidgets/quickwidget/rotatingsquare.qml @@ -31,6 +31,8 @@ Rectangle { text.api = "OpenGL on QRhi"; else if (api === GraphicsInfo.Direct3D11) text.api = "D3D11 on QRhi"; + else if (api === GraphicsInfo.Direct3D12) + text.api = "D3D12 on QRhi"; else if (api === GraphicsInfo.Vulkan) text.api = "Vulkan on QRhi"; else if (api === GraphicsInfo.Metal) |