使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限
Posted
技术标签:
【中文标题】使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限【英文标题】:Auto Grant access to Mic and Camera with 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();
【问题讨论】:
【参考方案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,所以我需要解决这个问题。以上是关于使用 Qt WebEngine 自动授予对麦克风和摄像头的访问权限的主要内容,如果未能解决你的问题,请参考以下文章
Yocto SDK,QtWebEngine:QT 中的未知模块:webengine
Qt5.9.1 和 Visual Studio 2015 添加 Qt WebEngine 模块