WebEngine Benachrichtigungen Beispiel

Zeigt, wie man HTML5-Web-Benachrichtigungen an Benutzer weitergibt.

WebEngine Notifications demonstriert die Verwendung der Methode QWebEngineProfile::setNotificationPresenter() und der Klasse QWebEngineNotification, um dem Benutzer eine HTML5-Webbenachrichtigung zu zeigen.

Ausführen des Beispiels

Um das Beispiel auszuführen Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

HTML-Seite

In diesem Beispiel wird eine interne HTML-Seite erstellt, die über eine Ressourcensammlungsdatei (.qrc) hinzugefügt wird. Die Seite zeigt Schaltflächen für die Anforderung von Berechtigungen an und enthält den erforderlichen JavaScript-Code, um diese Anforderung auszulösen:

            Notification.requestPermission().then(function (permission) {
                if (permission == 'granted')
                    createNotification()
            })

Die Seite enthält auch eine Schaltfläche zum Erstellen einer Benachrichtigung. Die folgenden JavaScript-Konstruktionen werden bei dem Ereignis "press" ausgeführt:

    function createNotification() {
        let title = 'Notification #' + ++notificationsCreated
        let options = { body: 'Visit doc.qt.io for more info!', icon: 'icon.png', }

        let notification = new Notification(title, options)
    }

Hauptfunktion

In der Funktion main instanziieren wir eine QWebEngineView, laden unsere interne HTML-Seite und richten die erforderlichen Callbacks für die Behandlung von Benachrichtigungen ein.

Abfrage von Funktionsberechtigungen

Anschließend verwenden wir den Aufruf QWebEnginePage::permissionRequested(), um die Erlaubnis des Benutzers anzufordern, Benachrichtigungen auf seinem Gerät anzuzeigen.

    QObject::connect(view.page(), &QWebEnginePage::permissionRequested,
                     [&] (QWebEnginePermission permission) {
                         if (permission.permissionType() != QWebEnginePermission::PermissionType::Notifications)
                             return;
                         permission.grant();
                     });
Behandlung neuer Benachrichtigungen

Anschließend konstruieren wir eine NotificationPopup, die die Daten der HTML-Webbenachrichtigung kapselt. Außerdem verwenden wir den Aufruf QWebEngineProfile::setNotificationPresenter(), um unseren Handler zu setzen, den wir in Verbindung mit unserem popup verwenden, um alle neuen Benachrichtigungen zu verarbeiten.

    auto popup = new NotificationPopup(&view);
    profile->setNotificationPresenter([&] (std::unique_ptr<QWebEngineNotification> notification)
                                      { popup->present(notification); });

Darstellung von Benachrichtigungen für Benutzer

Die Klasse NotificationPopup in diesem Beispiel ist eine einfache QWidget-basierte Klasse, die mehrere QLabel -Instanzen für die Anzeige des Titels, der Nachricht und des Symbols der Benachrichtigung verwendet.

class NotificationPopup : public QWidget
{
    Q_OBJECT

    QLabel m_icon, m_title, m_message;
    std::unique_ptr<QWebEngineNotification> notification;
Darstellung von Benachrichtigungen

In der Methode present wird zunächst die vorherige Benachrichtigung geschlossen und freigegeben, falls vorhanden, und dann eine neue Benachrichtigung übernommen, indem die Methode std::unique_ptr::swap für unsere interne Benachrichtigungsinstanz aufgerufen wird.

    void present(std::unique_ptr<QWebEngineNotification> &newNotification)
    {
        if (notification) {
            notification->close();
            notification.reset();
        }

        notification.swap(newNotification);

Dann fragen wir die Benachrichtigungsinstanz nach einem Titel, einer Nachricht und einem Symbol ab, indem wir QWebEngineNotification::title(), QWebEngineNotification::message(), QWebEngineNotification::icon() aufrufen und die entsprechenden Beschriftungen in unserem Popup einrichten.

        m_title.setText("<b>" + notification->title() + "</b>");
        m_message.setText(notification->message());
        m_icon.setPixmap(QPixmap::fromImage(notification->icon()).scaledToHeight(m_icon.height()));

Danach sind wir bereit, dem Benutzer unsere Benachrichtigung anzuzeigen, indem wir die Methode QWidget::show() aufrufen. In diesem Schritt rufen wir auch die Methode QWebEngineNotification::show() auf, um den Code JavaScript über unser Show-Ereignis zu informieren.

        show();
        notification->show();

Schließlich richten wir einen Rückruf ein, um das Schließereignis auf der Seite JavaScript zu behandeln, indem wir eine Verbindung mit dem Signal QWebEngineNotification::closed() herstellen. Wir planen auch ein Timer-Ereignis, um unsere aktive Benachrichtigung automatisch zu schließen.

        connect(notification.get(), &QWebEngineNotification::closed, this, &NotificationPopup::onClosed);
        QTimer::singleShot(10000, notification.get(), [&] () { onClosed(); });

    }
Aktive Benachrichtigung schließen

Wir führen den Schritt zum Schließen der aktiven Benachrichtigung entweder durch eine Zeitüberschreitung oder durch die Verarbeitung des Ereignisses JavaScript aus. Zuerst blenden wir das Popup-Widget selbst aus, indem wir QWidget::hide() aufrufen. Dann benachrichtigen wir den Code JavaScript, indem wir die Methode QWebEngineNotification::close() aufrufen. Schließlich zerstören wir das Benachrichtigungsobjekt mit der Methode std::unique_ptr::reset().

    void onClosed()
    {
        hide();
        notification->close();
        notification.reset();
    }
Implementierung der Benutzerinteraktion

Um den Klick-Schritt für eine Benachrichtigung zu implementieren, wird die Mausinteraktion über QWidget::mouseReleaseEvent() abgewickelt. Bei diesem Ereignis wird der Code JavaScript durch Aufruf der Methode QWebEngineNotification::click() benachrichtigt. Anschließend führen wir automatisch den Schritt "Schließen" aus, da eine Benachrichtigung als vollständig bearbeitet und nicht mehr benötigt gilt und daher zerstört werden kann.

    void mouseReleaseEvent(QMouseEvent *event) override
    {
        QWidget::mouseReleaseEvent(event);
        if (notification && event->button() == Qt::LeftButton) {
            notification->click();
            onClosed();
        }
    }

Beispielprojekt @ code.qt.io

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.