【问题标题】:Auto Grant access to Mic and Camera with Qt WebEngine使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限
【发布时间】:2018-03-16 03:33:02
【问题描述】:

我正在使用 RPi 和 WebRTC 构建家庭安全系统。我只需要一种方法来触发浏览器在给定的 URL 处打开并自动授予对麦克风和摄像头的访问权限。我曾希望将 WebEngine 库与 PyQt 一起使用,但用于 RPi 的 PyQt 不支持 WebEngine。所以我现在正在尝试 Qt 本身。不幸的是我不熟悉C++,所以我很挣扎。

示例here 有我需要的 90%。代码复制如下。我只需要调整它以在请求时授予对麦克风和摄像头的访问权限。我希望有人可以帮助我吗?

#include <QApplication>
#include <QWebEngineView>

QUrl commandLineUrlArgument()
{
    const QStringList args = QCoreApplication::arguments();
    for (const QString &arg : args.mid(1)) {
        if (!arg.startsWith(QLatin1Char('-')))
            return QUrl::fromUserInput(arg);
    }
    return QUrl(QStringLiteral("https://www.qt.io"));
}


int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QWebEngineView view;
    view.setUrl(commandLineUrlArgument());
    view.resize(1024, 750);
    view.show();

    return app.exec();
}

【问题讨论】:

    标签: c++ qt qt5 webrtc qwebengineview


    【解决方案1】:

    我回答了这个问题,但是对于 PyQt5:Grant access to Cam & Mic using Python for PyQt WebEngine,我只会做一个 C++ 到 Python 的翻译,基础是一样的。

    #include <QApplication>
    #include <QUrl>
    #include <QWebEngineView>
    
    class WebEnginePage: public QWebEnginePage{
        Q_OBJECT
    public:
        WebEnginePage(QObject *parent = Q_NULLPTR):QWebEnginePage(parent){
            connect(this, &WebEnginePage::featurePermissionRequested, this, &WebEnginePage::onFeaturePermissionRequested);
        }
    private Q_SLOTS:
        void onFeaturePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature){
    
            if(feature  == QWebEnginePage::MediaAudioCapture
                    || feature == QWebEnginePage::MediaVideoCapture
                    || feature == QWebEnginePage::MediaAudioVideoCapture)
                setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
            else
                setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser);
        }
    };
    
    QUrl commandLineUrlArgument()
    {
        const QStringList args = QCoreApplication::arguments();
        for (const QString &arg : args.mid(1)) {
            if (!arg.startsWith(QLatin1Char('-')))
                return QUrl::fromUserInput(arg);
        }
        return QUrl(QStringLiteral("https://www.qt.io"));
    }
    
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QApplication app(argc, argv);
        QWebEngineView view;
        view.setPage(new WebEnginePage);
        view.setUrl(commandLineUrlArgument());
        view.resize(1024, 750);
        view.show();
    
        return app.exec();
    }
    
    #include "main.moc"
    

    【讨论】:

    • 在创建信号和插槽时,Qt 创建处理这些连接的 moc 文件,当您创建 .ui 时,这些文件是自动创建的,但在 main.cpp 的情况下,您必须手动包含它,这就是为什么我有要在示例中执行此操作,请检查 http://doc.qt.io/qt-5/moc.html
    • @LeeMelbourne 如果我的回答对您有帮助,请将其标记为正确。
    • 非常感谢。当我运行发布的代码时,我得到“main.moc 没有这样的文件或目录”。如果我删除该行,我会得到“未定义的对 webenginepage 的 vtable 的引用”。你能帮忙解决我可能做错的事情吗?
    • @LeeMelbourne 在 Qt Creator 中转到 build 选项卡并按 run qmake 选项。
    • 太棒了!效果很好。不幸的是,当我访问诸如 meet.jit.si 或 append.in 之类的网站时,他们仍然提示使用 cam 和 mic。但我认为这来自他们的 Web 应用程序层,而不是来自浏览器。我不打算在 Pi 上使用 UI,所以我需要解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多