diff options
Diffstat (limited to 'examples')
7 files changed, 204 insertions, 7 deletions
diff --git a/examples/webenginewidgets/push-notifications/CMakeLists.txt b/examples/webenginewidgets/push-notifications/CMakeLists.txt index bbb585c9b..8ea2e25d1 100644 --- a/examples/webenginewidgets/push-notifications/CMakeLists.txt +++ b/examples/webenginewidgets/push-notifications/CMakeLists.txt @@ -2,6 +2,45 @@ # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16) -project(simplebrowser LANGUAGES CXX) +project(notifications LANGUAGES CXX) -message("\nPlease use simplebrowser to see notifiactions.\n") +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/webenginewidgets/push-notifications") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui WebEngineWidgets) + +qt_add_executable(push-notifications + main.cpp + notificationpopup.h +) + +set_target_properties(push-notifications PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(push-notifications PUBLIC + Qt::Core + Qt::Gui + Qt::WebEngineWidgets +) + +qt_add_resources(push-notifications "data" + PREFIX + "/" + BASE + "data" + FILES + "data/icon.png" +) + +install(TARGETS push-notifications + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/examples/webenginewidgets/push-notifications/data/data.qrc b/examples/webenginewidgets/push-notifications/data/data.qrc new file mode 100644 index 000000000..619648d1b --- /dev/null +++ b/examples/webenginewidgets/push-notifications/data/data.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>icon.png</file> + </qresource> +</RCC> diff --git a/examples/webenginewidgets/push-notifications/data/icon.png b/examples/webenginewidgets/push-notifications/data/icon.png Binary files differnew file mode 100644 index 000000000..4c3870c06 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/data/icon.png diff --git a/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc b/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc index 90b5212c8..2f234c1e0 100644 --- a/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc +++ b/examples/webenginewidgets/push-notifications/doc/src/push-notifications.qdoc @@ -172,12 +172,24 @@ To do that, we can simply enter in the console in the project's root directory: \snippet /push-notifications/commands 3 -Now we can fire up \e simplebrowser and enter \c http:\\localhost:5000 as a URL. +Now we can look into the \e push-notification browser application, which is based on +\l {WebEngine Notifications Example}: -\image website.png +\quotefromfile webenginewidgets/push-notifications/main.cpp +\skipto main +\printuntil app.exec +\printuntil } + +This application simply opens the page at \c http:\\localhost:5000. We are not going into detail +about how to open a notification as it is documented \l {WebEngine Notifications Example}{here}. +However, you need to modify the application in two ways. First, \c QWebEngineProfile cannot be +set to \e off-the-record because push messaging would be disabled. Therefore, as you can see +above, \c QWebEngineProfile is initialized with the name. Second, you need to enable push +messaging with the call QWebEngineProfile::setPushServiceEnabled for the created \c profile. -\note \c QWebEngineProfile cannot be set to \e off-the-record, because push messages would be -disabled. +When the application runs it displays: + +\image website.png After granting the permission we can send our ping request: @@ -187,5 +199,4 @@ We should see the coming push notification: \image notification.png -\note To troubleshoot errors, open \e {Developer Tools} from Tools menu. */ diff --git a/examples/webenginewidgets/push-notifications/main.cpp b/examples/webenginewidgets/push-notifications/main.cpp new file mode 100644 index 000000000..18a862182 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/main.cpp @@ -0,0 +1,41 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "notificationpopup.h" + +#include <QApplication> +#include <QWebEngineProfile> +#include <QWebEnginePage> +#include <QWebEngineView> + +int main(int argc, char *argv[]) +{ + QCoreApplication::setOrganizationName("QtExamples"); + QApplication app(argc, argv); + + const QString name = + QString::fromLatin1("push-notifications.%1").arg(qWebEngineChromiumVersion()); + + QScopedPointer<QWebEngineProfile> profile(new QWebEngineProfile(name)); + QWebEngineView view(profile.data()); + auto popup = new NotificationPopup(&view); + + QObject::connect(view.page(), &QWebEnginePage::featurePermissionRequested, + [&](const QUrl &origin, QWebEnginePage::Feature feature) { + if (feature != QWebEnginePage::Notifications) + return; + + view.page()->setFeaturePermission(origin, feature, + QWebEnginePage::PermissionGrantedByUser); + }); + + profile->setPushServiceEnabled(true); + profile->setNotificationPresenter([&](std::unique_ptr<QWebEngineNotification> notification) { + popup->present(notification); + }); + + view.resize(640, 480); + view.setUrl(QUrl("http://localhost:5000")); + view.show(); + return app.exec(); +} diff --git a/examples/webenginewidgets/push-notifications/notificationpopup.h b/examples/webenginewidgets/push-notifications/notificationpopup.h new file mode 100644 index 000000000..cf53ded45 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/notificationpopup.h @@ -0,0 +1,91 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#pragma once + +#include <QHBoxLayout> +#include <QLabel> +#include <QMouseEvent> +#include <QPushButton> +#include <QSpacerItem> +#include <QTimer> +#include <QVBoxLayout> +#include <QWebEngineNotification> + +#include <memory> + +class NotificationPopup : public QWidget +{ + Q_OBJECT + + QLabel m_icon, m_title, m_message; + std::unique_ptr<QWebEngineNotification> notification; + +public: + NotificationPopup(QWidget *parent) : QWidget(parent) + { + setWindowFlags(Qt::ToolTip); + auto rootLayout = new QHBoxLayout(this); + + rootLayout->addWidget(&m_icon); + + auto bodyLayout = new QVBoxLayout; + rootLayout->addLayout(bodyLayout); + + auto titleLayout = new QHBoxLayout; + bodyLayout->addLayout(titleLayout); + + titleLayout->addWidget(&m_title); + titleLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding)); + + auto close = new QPushButton(tr("Close")); + titleLayout->addWidget(close); + connect(close, &QPushButton::clicked, this, &NotificationPopup::onClosed); + + bodyLayout->addWidget(&m_message); + adjustSize(); + } + + void present(std::unique_ptr<QWebEngineNotification> &newNotification) + { + if (notification) { + notification->close(); + notification.reset(); + } + + notification.swap(newNotification); + + m_title.setText("<b>" + notification->title() + "</b>"); + m_message.setText(notification->message()); + m_icon.setPixmap(QPixmap(":/icon.png").scaledToHeight(m_icon.height())); + + show(); + notification->show(); + + connect(notification.get(), &QWebEngineNotification::closed, this, + &NotificationPopup::onClosed); + QTimer::singleShot(10000, notification.get(), [&]() { onClosed(); }); + + // position our popup in the right corner of its parent widget + move(parentWidget()->mapToGlobal(parentWidget()->rect().bottomRight() + - QPoint(width() + 10, height() + 10))); + } + +protected slots: + void onClosed() + { + hide(); + notification->close(); + notification.reset(); + } + +protected: + void mouseReleaseEvent(QMouseEvent *event) override + { + QWidget::mouseReleaseEvent(event); + if (notification && event->button() == Qt::LeftButton) { + notification->click(); + onClosed(); + } + } +}; diff --git a/examples/webenginewidgets/push-notifications/push-notifications.pro b/examples/webenginewidgets/push-notifications/push-notifications.pro new file mode 100644 index 000000000..5ffb85fd7 --- /dev/null +++ b/examples/webenginewidgets/push-notifications/push-notifications.pro @@ -0,0 +1,10 @@ +QT += webenginewidgets + +HEADERS = notificationpopup.h + +SOURCES = main.cpp + +RESOURCES = data/data.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/webenginewidgets/push-notifications +INSTALLS += target |