gpt4 book ai didi

c++ - QT中如何自定义 "Notification Web API"

转载 作者:行者123 更新时间:2023-11-30 02:40:36 28 4
gpt4 key购买 nike

我正在使用 QtWebkit 创建一个简单的浏览器, 我设法添加了对 Notification Web API 的支持它,使用 QWebPage::setFeaturePermission

例子:

function notifyMe() {
if (Notification.permission === "granted") {
var notification = new Notification("Hi there!");
} else if (Notification.permission !== "denied") {
Notification.requestPermission(function(permission) {
if (permission === "granted") {
var notification = new Notification("Hi there!");
}
});
}
}

<button onclick="notifyMe();">Notify me</button>

我的代码:

QObject::connect(page,
SIGNAL(featurePermissionRequested(QWebFrame*, QWebPage::Feature)), this,
SLOT(featurePermissionRequested(QWebFrame*,QWebPage::Feature))
);

...

void Form::featurePermissionRequested(QWebFrame* frame, QWebPage::Feature feature) {
switch (feature) {
case QWebPage::Notifications:
qDebug() << "Notification";
page->setFeaturePermission(frame, feature, QWebPage::PermissionGrantedByUser);
break;
case QWebPage::Geolocation:
qDebug() << "GEO";
break;
default:
qDebug() << "Unknown feature";
}
}

每次我点击“通知我”按钮时,桌面上都会出现以下消息:

Desktop Notification

可以在 QT 中自定义通知吗?换句话说,离开类似于 GoogleChrome 或 Firefox,像这样:

Web Notification

最佳答案

自定义Notifications Web APIQtWebkit您必须使用“Webkit 插件”,换句话说,创建一个插件并放入 qtdir/plugins/webkit .

Note: For create plugin is needed <QtWebKit/QWebKitPlatformPlugin> class

创建插件:

  • 在 QtCreator 中创建一个项目
  • .pro文件使用(例如 src.pro ):

    TARGET = $$qtLibraryTarget(mywebkitplugin)
    TEMPLATE = lib
    CONFIG += plugin

    HEADERS += $$[QT_INSTALL_HEADERS]/QtWebKit/qwebkitplatformplugin.h \
    mywebkitplugin.h

    SOURCES += \
    mywebkitplugin.cpp

    Release:DESTDIR = $$PWD/bin/release
    Release:UI_DIR = $${DESTDIR}/.ui
    Release:MOC_DIR = $${DESTDIR}/.moc
    Release:RCC_DIR = $${DESTDIR}/.rcc
    Release:OBJECTS_DIR = $${DESTDIR}/.obj

    Debug:DESTDIR = $$PWD/bin/debug
    Debug:UI_DIR = $${DESTDIR}/.ui
    Debug:MOC_DIR = $${DESTDIR}/.moc
    Debug:RCC_DIR = $${DESTDIR}/.rcc
    Debug:OBJECTS_DIR = $${DESTDIR}/.obj
  • 创建 mywebkitplugin.h

    #ifndef MYWEBKITPLUGIN_H
    #define MYWEBKITPLUGIN_H

    #include <QtWebKit/QWebKitPlatformPlugin>

    class MyWebKitPlugin : public QObject, public QWebKitPlatformPlugin
    {
    Q_OBJECT
    Q_INTERFACES(QWebKitPlatformPlugin)

    #if QT_VERSION >= 0x050000
    Q_PLUGIN_METADATA(IID "org.qtwebkit.QtWebKit.QtWebPlugin")
    #endif

    public:
    explicit MyWebKitPlugin();
    ~MyWebKitPlugin();

    bool supportsExtension(Extension ext) const;
    QObject* createExtension(Extension ext) const;
    };

    #endif // MYWEBKITPLUGIN_H
  • 创建 mywebkitplugin.cpp

    #include "mywebkitplugin.h"
    #include "notification/notification.h"

    MyWebKitPlugin::MyWebKitPlugin()
    {
    }

    MyWebKitPlugin::~MyWebKitPlugin()
    {
    }

    bool MyWebKitPlugin::supportsExtension(Extension ext) const
    {
    return ext == Notifications;
    }

    QObject* MyWebKitPlugin::createExtension(Extension ext) const
    {
    switch (ext) {
    case Notifications:
    return new Notification();

    default:
    return 0;
    }
    }

    //for QT-4.8
    #if QT_VERSION < 0x050000
    Q_EXPORT_PLUGIN2(webkitplugin, MyWebKitPlugin);
    #endif
  • 创建 notification文件夹

  • 在通知文件夹中放置通知类:

    通知.h

    #ifndef NOTIFICATION_H
    #define NOTIFICATION_H

    #include <QtWebKit/QWebKitPlatformPlugin>

    class Notification : public QWebNotificationPresenter
    {
    Q_OBJECT

    public:
    explicit Notification();
    ~Notification();

    void showNotification(const QWebNotificationData* data);

    signals:
    void notificationClosed();
    void notificationClicked();
    };

    #endif // NOTIFICATION_H

    通知.cpp

    #include "notification.h"
    #include <QDebug>

    Notification::Notification() : QWebNotificationPresenter()
    {
    qDebug() << "Create: Notification";
    }

    Notification::~Notification()
    {
    qDebug() << "Delete: this (Notification)";
    }

    void Notification::showNotification(const QWebNotificationData* data)
    {
    qDebug() << "title:" << data->title();
    qDebug() << "icon:" << data->iconUrl();
    qDebug() << "message:" << data->message();
    qDebug() << "opener page:" << data->openerPageUrl();
    }

用于创建通知自定义更改 Notification::showNotification(const QWebNotificationData* data)内容及用途QWebNotificationData* dataJavaScript API 获取数据.

  • 创建 notification.pri (包含在 src.pro 中):

    QT += network

    HEADERS += \
    $$PWD/notification.h

    SOURCES += \
    $$PWD/notification.cpp
  • 添加notification.prisrc.pro :

    include($$PWD/notification/notification.pri)

编译/构建:

  • 打开src.pro在 QtCreator 中
  • 点击 Build (在 Release模式下)(或使用 Ctrl+B)按钮(不要单击 Run 按钮,不要' t 使用 Ctrl+R)
  • 关闭 src.pro
  • 转到位于src.pro 的文件夹
  • (如果是 Release模式)打开 bin/release文件夹
  • (如果是 Debug模式)打开 bin/debug文件夹
  • (如果是 Release模式)复制 mywebkitplugin.dllQtDir/plugins/webkit/mywebkitplugin.dll (例如使用 mingw:C:/qt/qt5.4/mingw/plugin/webkit/mywebkitplugin.dll)
  • (如果是 Debug模式)复制 mywebkitplugind.dllQtDir/plugins/webkit/mywebkitplugind.dll (例如使用 mingw:C:/qt/qt5.4/mingw/plugin/webkit/mywebkitplugind.dll)
  • 如果webkit文件夹不存在,创建它。
  • 使用 QWebView 打开您的项目和测试Notification Web API .

运行使用 QWebView 的项目时, 它会自动加载 dll (不需要在您的项目中进行额外配置)并将“替换”默认值 Notifications ( QtWebkit 在 Windows 中使用 SystemTrayIcon 来显示 Notification Web API )作为您的“自定义小部件”。

插件项目的文件夹结构:

mywebkitplugin
├── `src.pro`
├── mywebkitplugin.h
├── mywebkitplugin.cpp
└── notification
├── notification.h
├── notification.cpp
└── `notification.pri`

关于c++ - QT中如何自定义 "Notification Web API",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824296/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com