Qt-Web混合开发-QWebEnginePage权限管理(3)

news2024/11/24 13:25:03

Qt-Web混合开发-使用QWebEnginePage打开摄像头演示权限管理🏳️‍🌈

文章目录

  • Qt-Web混合开发-使用QWebEnginePage打开摄像头演示权限管理🏳️‍🌈
    • 1、概述🚩
    • 2、实现效果🥽
    • 3、实现功能🔊
    • 4、关键代码🚚
    • 5、源代码🔔

更多精彩内容
👉个人内容分类汇总 👈
👉Qt - Web混合开发👈

1、概述🚩

  • Qt版本:V5.12.5
  • 注意:windows下webenginewidgets只支持MSVC编译器,不支持MinGW(mingw好像需要自己编译);
  • 在使用QWebEngineView内嵌网页时有些功能需要授权才可以使用,例如打开摄像头、麦克风、定位等功能需要授权;
  • 当程序需要授权时QWebEnginePage会发出featurePermissionRequested()信号,当接收到信号后需要在槽函数中通过QWebEnginePage::setFeaturePermission()函数授权,程序才可以正常运行;

2、实现效果🥽

  • 本地html文件打开摄像头授权

    在这里插入图片描述

  • 在线网站打开摄像头授权

    在这里插入图片描述

3、实现功能🔊

  1. 使用QWebEnginePage有时需要权限,例如打开摄像头、麦克风;
  2. 使用Qt + html打开摄像头功能;
  3. 这里演示了怎么实现授权功能;
  4. 分别展示了打开【网络地址】授权和打开【本地html】授权。

4、关键代码🚚

  • pro文件
QT += webenginewidgets    # 使用QWebEngineView需要加载模块
  • video.html:编写一个html文件用于打开摄像头
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>打开摄像头</title>
	<style>
		video {
			width: 50%;
			height: 50%;
			margin: 50px auto; /*则表示上下边界为50,左右则根据宽度自适应相同值(即水平居中)*/
			background-color: #484848 ;
			display: block;   /*将元素显示为块级元素。*/
		}
		.button {
		  background-color: #4CAF50; /* Green */
		  border: none;
		  color: white;
		  padding: 15px 32px;
		  text-align: center;
		  text-decoration: none;
		  display: inline-block;
		  font-size: 16px;
		  margin: 4px 2px;
		  cursor: pointer;
		  -webkit-transition-duration: 0.4s; /* Safari */
		  transition-duration: 0.4s;
		  box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
		}
		.button:hover {
		  box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
		}
	</style>
	<script>
	// 打开摄像头,最新的标准API
	function openVideo() {
		var video = document.getElementById("video");
		navigator.mediaDevices.getUserMedia({video : {width: 800, height: 600}}).then(success).catch(error);
	}
	// 视频播放回调函数
	function success(stream) {
		video.srcObject = stream;  //将视频流设置为video元素的源
		video.play();              //播放视频
	}
	// 异常的回调函数
	function error(error) {
		console.log("访问用户媒体设备失败:",error.name,error.message);
    }
	</script>
</head>
<body>
	<video id="video"></video>
	<div align="center">
		<button id="open" class="button" onclick="openVideo()">打开摄像头</button>
	</div>
</body>
</html>
  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <qwebenginepage.h>
class QWebEngineView;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void on_featurePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature);

private:
    QWebEngineView* m_view = nullptr;
};
#endif // MAINWINDOW_H

  • mainwindow.cpp
#include "mainwindow.h"
#include <QWebEngineView>
#include <QMap>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , m_view(new QWebEngineView(this))
{
    this->resize(1024, 750);          // 设置窗口大小
    this->setWindowTitle(QString("QWebEnginePage权限管理 - V%1").arg(APP_VERSION));  // 设置窗口标题

    this->setCentralWidget(m_view);          // 将m_view设置为主窗口的中心小部件
    QWebEnginePage* page = m_view->page();
    connect(page, &QWebEnginePage::featurePermissionRequested, this, &MainWindow::on_featurePermissionRequested);

#if 0
    page->load(QUrl(QStringLiteral("https://app.xunjieshipin.com/luping/")));
#else
    page->load(QUrl(QStringLiteral("qrc:/video.html")));
#endif
}

MainWindow::~MainWindow()
{
}

/**
 * @brief                 当securityOrigin标识的网站请求使用功能标识的资源或设备时,会发出信号,触发当前函数
 * @param securityOrigin
 * @param feature
 */
void MainWindow::on_featurePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature)
{
    QString strFeature = "程序需要使用";
    switch (feature)
    {
    case QWebEnginePage::Notifications:
        strFeature += "Notifications";
        break;
    case QWebEnginePage::Geolocation:
        strFeature += "定位硬件或服务";
        break;
    case QWebEnginePage::MediaAudioCapture:
        strFeature += "音频捕获设备,如麦克风";
        break;
    case QWebEnginePage::MediaVideoCapture:
        strFeature += "视频设备,如摄像机";
        break;
    case QWebEnginePage::MediaAudioVideoCapture:
        strFeature += "音频和视频捕获设备";
        break;
    case QWebEnginePage::MouseLock:
        strFeature += "鼠标锁定";
        break;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))    // 后面两个枚举Qt5.10以后才有
    case QWebEnginePage::DesktopVideoCapture:
        strFeature += "视频输出捕获";
        break;
    case QWebEnginePage::DesktopAudioVideoCapture:
        strFeature += "音频和视频输出捕获";
        break;
#endif
    }
    strFeature += ",是否允许?";

    // 弹出一个弹窗
    QMessageBox msg(this);
    msg.setIcon(QMessageBox::Information);
    msg.setWindowTitle("注意!");
    msg.setText(QString("%1").arg(securityOrigin.toString()));
    msg.setInformativeText(strFeature);
    msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msg.setDefaultButton(QMessageBox::Yes);

    if(msg.exec() == QMessageBox::Yes)
    {
        // 用户已授予权限
        m_view->page()->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
    }
    else
    {
        // 用户拒绝了权限
        m_view->page()->setFeaturePermission(securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser);
    }
}


5、源代码🔔

  • gitee
  • github

\やほー/\バンザイ/
ʕ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ•̫͡•ʕ•̫͡•ʔ•̫͡•ʔ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PodSummPreSumm

PodSumm&#xff1a;播客音频摘要 论文地址 简介 最近播客的流行给现有的内容发现和推荐系统带来了巨⼤的机遇和⼀系列独特的挑战。与听音乐不同&#xff0c;播客通常需要听众长时间积极关注。演讲者的演讲风格、幽默类型或制作质量等主观属性可能会影响听众的偏好&#xff…

CVPR2022 | 动作识别框架新范式 STRM,用最小的样本获得最高的精度

论文题目&#xff1a;Spatio-temporal Relation Modeling for Few-shot Action Recognition 论文连接&#xff1a;https://arxiv.org/abs/2112.05132v2 代码连接&#xff1a;https://github.com/Anirudh257/strm 综述 我们提出了一种few-shot动作识别框架STRM&#xff0c;它…

非线性非高斯模型的改进粒子滤波算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

unordered_mapunordered_set的应用以及底层实现(哈希表)

文章目录1️⃣unordered系列关联容器unordered_setunordered_map2️⃣底层结构哈希概念哈希冲突哈希函数常见的哈希函数哈希冲突解决闭散列线性探测的实现开散列开散列的概念开散列的实现3️⃣模拟实现unordered_map&&unordered_set哈希表的改造unordered_setunordered…

Improving Convolutional Networks with Self-Calibrated Convolutions

Improving Convolutional Networks with Self-Calibrated Convolutions一、引言二、方法实现一、Self-Calibrated Convolutions二、Instantiations三、实验一、消融实验二、目标检测三、关键点检测论文&#xff1a; http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf代码: http…

CUDA 编程简介(下)

文章目录Memoryshared memoryglobal memoryTransfer Data异步预取Threadsthread blockwarpGPU 性能查看性能测试性能CUDA 流Memory GPU 在 CUDA Mode 下&#xff0c;有多种存储类型&#xff1a; register&#xff1a; 位于 SM 上&#xff0c;共 819281928192 个。作用范围是 th…

01. Web漏洞靶场的搭建

01. Web漏洞靶场的搭建 Web漏洞靶场的搭建&#xff08;上&#xff09; 什么是Web安全&#xff1f; 什么是Web Web是互联网的总称&#xff0c;全称为World Wide Web&#xff0c;缩写WWW&#xff0c;即全球广域网&#xff0c;也称为万维网&#xff0c;它是一种基于超文本和HT…

前端入门教程:CSS标准盒模型和怪异盒模型区别

理解盒模型&#xff1a;CSS3 中的盒模型有以下两种&#xff1a;标准盒模型、IE盒子模型(怪异盒模型)&#xff0c;盒模型是由4个部分组成&#xff0c;由内向外分别是content(下图蓝色部分)、padding、border、margin盒模型有5个属性&#xff1a; width 元素宽height 元素高borde…

计算机网络题库---第六章应用层

主要选取谢希仁第八版&#xff0c;复习资料&#xff0c;学校期末划重点 &#xff08;一&#xff09;课本答案 1.互联网的域名结构是怎样的?它与目前的电话网的号码结构有何异同之处&#xff1f; 答&#xff1a; 2.域名系统的主要功能及域名系统中的本地域名服务器、根域名服…

世界杯竞猜项目Dapp-第三章(ERC20)

ERC20 是标准的以太坊 Token 协议&#xff0c;它也是一个合约代码&#xff0c;只要在该合约内部实现了特定的 6 个方法&#xff0c;就会被系统判定为代币合约&#xff0c;具体总结为&#xff1a;6 个必要接口&#xff0c;2 个必要事件&#xff0c;3 个可选接口&#xff0c;详情…

信贷产品年终总结之客群特征画像

临近年末&#xff0c;围绕信贷产品业务的年终总结&#xff0c;是各家金融机构或科技公司的必要工作内容之一。根据实际业务的数据表现进行汇总分析&#xff0c;不仅为回顾过去业务经营的全貌特点&#xff0c;提供了客观的数据分布描述&#xff0c;而且对后期业务开展的策略制定…

H-03卷积神经网络中卷积的作用与原理

目录 1.前言 2.卷积的作用 3.卷积的参数 3.1 卷积核大小&#xff08;kernel_size&#xff09; 3.2 填充&#xff08;padding&#xff09; 3.2.1 same 3.2.2 valid 3.2.3 full 3.3 卷积核算子&#xff08;operator&#xff09; 3.3.1 Robert 算子 3.3.2 Prewitt算子 …

2023就要你换个方式过新年!富而喜悦一年一渡开启新方式!

过去的一年&#xff0c;你过得怎么样&#xff1f;是否有过艰难的逆流时刻&#xff0c;是否拥有过快乐和满足&#xff0c;又是否得到了成长和收获&#xff1f;富而喜悦2023一年一渡财富流新年主题活动就要给你一个礼物多多&#xff01;美美的“礼物”活动&#xff01; 为此&…

艾美捷ichorbio CD4体内抗体,无惧竞争对手

CD4&#xff08;分化簇4&#xff09;是一种在辅助T细胞、调节性T细胞、单核细胞、巨噬细胞和树突状细胞表面表达的糖蛋白。CD4与主要组织相容性复合体&#xff08;MHC&#xff09;的II类分子相互作用&#xff0c;增强T细胞活化的信号。 艾美捷ichorbio CD4体内抗体-低内毒素&am…

基于web得数字媒体资源库系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

VCS2 VCS仿真的基础

1、基础知识 编译流程&#xff1a; -Mupdate &#xff1a;增量编译&#xff0c;作用是将需要修改的某个文件修改后重新编译&#xff0c;其.o文件再与其他文件相链接。 -R &#xff1a;编译后立马执行。 -gui &#xff1a;打开DVE的实时GUI。 -l &#xff1a;把编译过程中产生…

CDH6.3.2防止被攻击,打补丁(未授权漏洞)

参考&#xff1a;CDH6.3.2Hadoop默认配置下存在未授权漏洞&#xff0c;禁止匿名访问 - 民宿 - 博客园 这段时间公司的运维大佬扫描安全漏洞的时候&#xff0c;发现有漏洞会被攻击&#xff0c;原因是没有新增用户校验&#xff0c;允许匿名去访问。这样的话。可以操作HDFS和Yarn上…

【iOS】熟悉Objective-C

熟悉Objective-C Objective—C通过一套全新的语法&#xff0c;在C语言基础上添加了面向对象的特性 频繁使用方括号和极长的方法名&#xff0c;使得代码十分易读。 了解Objective-C的起源 Obejective-C与C&#xff0c;java等面向对象的语言类似&#xff0c;在语法上使用“消息结…

【GRU时序预测】基于门控循环单元GRU实现时间序列预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【云原生进阶之容器】第一章Docker核心技术1.3节——命名空间Namespace

1. Linux Namespaces机制简介 Linux Namespace是Linux提供的一种内核级别环境隔离的方法。很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在…