qt6 获取百度地图(一)

需求分析:

要获取一个地图,

需要ip

需要根据ip查询经纬度

根据经纬度查询地图

另外一条线是根据输入的地址 查询ip 根据查询到的ip查地图‘

最后,要渲染地图

上面这这些动作,要进行http查询:

为此要有三个QNetworkAccessManager对象:

    QNetworkAccessManager *m_ipManager;  // 用于ip管理QNetworkAccessManager *m_locManager;   // 用于查询位置//网络管理对象  发送地图图片QNetworkAccessManager *m_mapManager;   //查询地图//响应对象 接收地图图片QNetworkReply *m_mapReply=NULL;   //响应

所有的查询动作当然能顺序执行:

如先查询ip

    等待获取IP返回结果

         如果IP返回了,发起根据IP查询经纬度的请求

                等待经纬度查询结果,如果获得的返回,则进一步根据返回的经纬度查询地图数据

                         等待地图数据查询结果,把结果写入文件

                                  从文件中读取数据,渲染到weigt上

但是 如果其中某个环节网络断了 或者百度服务器宕机了,系统就会卡死。

按上面步骤,网络请求是同步顺序,执行来的,用户界面可能会阻塞,用户体验欠佳。

为此我们引入槽函数机制!让网络请求是异步进行,用户界面不会阻塞,这提供了更好的用户体验!

在构造函数中,添加如下代码:

Form1::Form1(QWidget *parent): QWidget(parent), ui(new Ui::Form1)
{ui->setupUi(this);//new一个网络管理对象m_ipManager = new QNetworkAccessManager(this);  //  net connection tool ,duty is to connect to the server//declare  connect relationship ,when receive the response ,call the slot function,response is finished signalconnect(m_ipManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetIp(QNetworkReply*)));m_locManager=new QNetworkAccessManager(this);  //net connection tool ,duty is to connect to the server for location//declare  connect relationship ,when receive the response ,call the slot function,response is finished signalconnect(m_locManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onGetCurrentLoc(QNetworkReply*)));m_mapManager=new QNetworkAccessManager(this);   //net connection tool ,duty is to connect to the server for map query mapconnect(m_mapManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onSendMapRequest()));
}

和上面connect函数配套的也有三个槽函数,当网络请求有响应的时候,执行响应的槽函数。

配套的三个槽函数,在头文件中 declare如下图:

private slots://处理获取外网ip请求的 槽void onGetIp(QNetworkReply*);//根据ip获取经纬度  处理服务器响应内容void onGetCurrentLoc(QNetworkReply*);//处理服务器返回地图图片void onSendMapRequest();

这样,所有网络查询与处理事异步进行的。

让我们从查询Ip地址起步:

首先通过QNetworkAccessManager 一个实例对象 m_ipManager发起一个request请求。

void Form1::getIp()
{// by m_ipManager query ipQUrl url("http://httpbin.org/ip");  //declare the urlQNetworkRequest request(url);  //declare the requestm_ipManager->get(request);   //send the request
}

这个请求的响应?

嗯嗯,当然在槽函数当中了~~~ 窗体的构造函数中不是“声明”了一个“连接”吗

 connect(m_ipManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetIp(QNetworkReply*)));

当网络请求有相应的回来的时候,执行槽函数onGetIp,

在这个onGetIp函数中,我们取得服务端返回数据,从中解析出ip地址,进一步的, 我们会根据ip地址查询经纬度数据。

void Form1::onGetIp(QNetworkReply *reply)
{//get the ip address,by ip value query the locationQJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());QJsonObject jsonObj = jsonDoc.object();currentIp=jsonObj.value("origin").toString();qDebug() << "Current IP:" << currentIp;//by ip value query the locationgetLocation();}void Form1::getLocation()
{//by ip address ,query the locationQUrl url("http://api.map.baidu.com/location/ip?ip="+currentIp+"&ak="+ak);QNetworkRequest request(url);m_locManager->get(request);
}

上面查询经纬度数据的时候,用的是QNetworkAccessManager 一个实例对象 m_locManager,当这个对象发起request请求后,它的工作就算完成了。

结果?结果当然是另外一个槽函数来处理了。

connect(m_locManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onGetCurrentLoc(QNetworkReply*)));

 onGetCurrentLoc这个槽函数中,获取上一步request查询结果,从结果中解析出经纬度,根据经纬度的数据,调用查询地图数据的函数。

完整代码如下:

//json数据的一个样本如下
// {
//     "address": "CN|辽宁省|大连市|None|None|100|75",
//     "content": {
//         "address_detail": {
//             "province": "辽宁省",
//             "city": "大连市",
//             "district": "",
//             "street": "",
//             "street_number": "",
//             "city_code": 167,
//             "adcode": "210200"
//         },
//         "address": "辽宁省大连市",
//         "point": {
//             "x": "13539005.4",
//             "y": "4682974.61"
//         }
//     },
//     "status": 0
// }void Form1::onGetCurrentLoc(QNetworkReply * reply)
{//根据经纬度发起查询地图QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());//parse the json data,get the location data from the json dataQJsonObject jsonObj = jsonDoc.object();QJsonObject contentObj = jsonObj.value("content").toObject();QJsonObject pointObj = contentObj.value("point").toObject();m_lng = pointObj.value("x").toString().toDouble();m_lat = pointObj.value("y").toString().toDouble();qDebug() << "经度:" << m_lng << "纬度:" << m_lat;//根据经纬度发起查询地图请求//发起查询地图请求sendMapRequest();}

到这一步,我们可以先测试一下:~~~~~~~~~~~~

看上去一切正常!

其中,sendMapRequest,当然是用一个对象发起一个请求,结果同样是在对应的槽函数当中处理

sendMapRequest完整代码如下:

void Form1::sendMapRequest()
{//by location query the map, use  m_mapManagerQString url="http://api.map.baidu.com/staticimage/v2?ak="+ak+"&center="+QString::number(m_lng)+","+QString::number(m_lat)+"&width=1024&height=768&zoom="+QString::number(m_zoom);QNetworkRequest request(url);m_mapManager->get(request);
}

好了吗?且慢,网络查询获取的地图数据,也只能是应答对象reply,给出完成型号的时候,才能进行,就是说,构造函数中 connect(m_mapManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onSendMapRequest()));  不是很合适,那就改造它,

构造函数相关代码改造为:

Form1::Form1(QWidget *parent): QWidget(parent), ui(new Ui::Form1)
{ui->setupUi(this);//new一个网络管理对象m_ipManager = new QNetworkAccessManager(this);  //  net connection tool ,duty is to connect to the server//declare  connect relationship ,when receive the response ,call the slot function,response is finished signalconnect(m_ipManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetIp(QNetworkReply*)));m_locManager=new QNetworkAccessManager(this);  //net connection tool ,duty is to connect to the server for location//declare  connect relationship ,when receive the response ,call the slot function,response is finished signalconnect(m_locManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onGetCurrentLoc(QNetworkReply*)));m_mapManager=new QNetworkAccessManager(this);  //注释掉下面的行  只有收到reply发出的准备好信号 我们才能读取数据,保存到文件当中// connect(m_mapManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onSendMapRequest()));
}

只有reply发出准备好可以读数据的信号后,才能,触发对应的槽函数:由于读取文件数据是个昂贵的资源,所以我们要

 void  MainWindow::sendMapRequest(){//how//断调前一次请求if(m_mapReply!=NULL){m_mapReply->disconnect();//断掉事件连接disconnect(m_mapReply,&QIODevice::readyRead,this,&MainWindow::onSendMapRequest);}//开始新的请求//url//请求地址QString host= "http://api.map.baidu.com/staticimage/v2";//请求参数QString query_str=QString("ak=%1&width=512&height=256&center=%2,%3&zoom=%4").arg(ak).arg(m_lng).arg(m_lat).arg(m_zoom);QUrl url(host+"?"+query_str);qDebug()<<host+"?"+query_str<<endl;QNetworkRequest request(url);//此处与前面的请求不同,等待服务器响应,m_mapReply= m_mapManager->get(request);//连接事件,处理服务器返回的 文件流connect(m_mapReply,&QIODevice::readyRead,this,&MainWindow::onSendMapRequest);}

获取地图数据是个相对比较昂贵的操作,假如原来有个正在处理的响应呢,当然应该断掉原来的响应啊。所有有了下面的代码:

     //断调前一次请求if(m_mapReply!=NULL){m_mapReply->disconnect();//断掉事件连接disconnect(m_mapReply,&QIODevice::readyRead,this,&MainWindow::onSendMapRequest);}

回顾上面的代码sendMapRequest中执行的动作为:

断开原有的http连接

断开reply相关的槽函数链接

通过http发起查询地图的连接

建了信号与槽函数间的联系,通过槽函数,处理数据,。

最后一步:如何把读取到的数据存放到文件中,且渲染到weight当中呢?

且听下回分解,明天见!

ps:   测试根据ip查询经纬度的数据:http://api.map.baidu.com/location/ip?ip=42.84.232.111&ak=***********

ps:问题1:qt6 处理图像的基本步骤:

在Qt6中处理图像的基本步骤通常涉及以下几个关键方面,以及所使用的核心工具类。以下是一个简要的描述:

基本步骤

  1. 创建图像对象
    首先,需要创建一个QImageQPixmap对象来存储或处理图像。QImage是一个类,用于处理图像数据,支持多种图像格式和色彩深度,包括灰度图像、彩色图像和索引图像。它提供了丰富的图像处理功能,如读取、写入、转换图像格式等。

  2. 读取图像数据
    使用QImageload()函数从文件、数据流或其他源中读取图像数据。这个函数支持多种图像格式,如PNG、JPEG、BMP等。

  3. 处理图像
    通过QImage提供的各种函数对图像进行处理,如缩放、裁剪、旋转、颜色转换等。Qt6还提供了更高级的图像处理功能,如滤镜效果、图像分析等,这些功能可能通过其他类库(如Qt Image Processing模块)实现。

  4. 显示图像
    将处理后的图像显示在界面上,通常可以通过将QImage转换为QPixmap(如果需要的话),然后使用QLabelQGraphicsView等控件进行显示。

  5. 保存图像
    如果需要,可以将处理后的图像保存回文件或其他存储介质。使用QImagesave()函数可以实现这一功能。

用到的工具类

  • QImage:用于处理图像数据,包括读取、写入、转换格式和进行基本的图像处理。
  • QPixmap:与QImage类似,但优化了图像在屏幕上的显示性能。通常用于将图像显示在GUI控件中。
  • QPainter:虽然主要用于绘图,但在图像处理过程中也可以用来在图像上绘制图形或文本,实现更复杂的图像处理效果。
  • 其他Qt图像处理模块:Qt可能还提供了其他专门的图像处理模块,如Qt Image Processing,这些模块提供了更高级的图像处理功能。

综上所述,Qt6处理图像的基本步骤包括创建图像对象、读取图像数据、处理图像、显示图像和保存图像,而用到的核心工具类主要是QImageQPixmap,辅以QPainter和其他可能的Qt图像处理模块。

问题2:qt6 用QPainter绘制图像有哪些功能,具体步骤是什么

在Qt6中,QPainter是用于在各种绘制设备(如窗口、图片等)上进行绘图的强大工具类。使用QPainter绘制图像时,它提供了丰富的功能,包括但不限于:

  1. 基本图形绘制:可以绘制点、线、矩形、圆形、椭圆等基本图形,以及更复杂的形状如多边形、扇形等。

  2. 文本绘制:支持绘制文本,并可以设置文本的字体、颜色、位置等属性。

  3. 图像绘制:可以直接在绘图设备上绘制图像(如QImageQPixmap中的图像)。

  4. 变换:支持坐标变换,如平移、旋转、缩放等,以实现对图形的变换处理。

具体步骤通常包括:

  1. 创建QPainter对象:在绘图事件处理函数(如paintEvent)中创建QPainter对象,并指定绘图设备(如this指针,表示在当前窗口上绘图)。

  2. 设置绘制属性:根据需要设置画笔(QPen)、画刷(QBrush)、字体(QFont)等属性。

  3. 进行绘图操作:使用QPainter提供的绘图函数进行绘图,如drawLinedrawRectdrawText等。

  4. 结束绘图:绘图完成后,QPainter对象会自动销毁,或者可以显式调用其end()方法来结束绘图操作(尽管在自动管理的上下文中通常不需要)。

通过这些步骤,开发者可以在Qt6应用程序中实现丰富的图形绘制功能。

问题3:QPainter 与 QImage QPixmap 的关系是什么

QPainter、QImage和QPixmap在Qt框架中各自扮演着重要的角色,并且它们之间存在着紧密的关系。以下是对这三者之间关系的详细阐述:

1. QPainter

  • 功能:QPainter是Qt中用于在绘图设备上进行绘图的类。它提供了丰富的绘图函数,如绘制线条、形状、文本以及图像等。
  • 与QImage和QPixmap的关系:QPainter可以作用于QImage和QPixmap上,进行图像的绘制和编辑。这意味着,你可以使用QPainter在QImage或QPixmap对象上绘制图形、文本或其他图像。

2. QImage

  • 功能:QImage是Qt中用于处理图像数据的类。它提供了对图像像素的直接访问,允许进行图像的读取、写入、转换以及像素级别的操作。
  • 与QPainter的关系:QImage是QPaintDevice的子类,因此QPainter可以直接在其上进行绘制。这使得QImage成为一个非常灵活的绘图表面,可以在其上绘制图形、文本或其他图像。
  • 特点:QImage不依赖于底层硬件,提供了独立于平台的图像处理能力。它支持多种图像格式和色彩深度,并允许在多个线程中进行图像的读取和写入操作。

3. QPixmap

  • 功能:QPixmap是Qt中专门用于在屏幕上显示图像优化的类。它针对屏幕显示进行了优化,能够提供更好的性能和显示效果。
  • 与QPainter的关系:与QImage类似,QPixmap也是QPaintDevice的子类,因此QPainter同样可以在其上进行绘制。但是,由于QPixmap是为屏幕显示而优化的,因此它更适合在GUI应用程序中使用。
  • 特点:QPixmap依赖于底层平台的绘制系统,因此在不同的操作系统上可能会有不同的显示效果。此外,由于它针对屏幕显示进行了优化,因此在处理大型图像或进行复杂图像处理时可能会比QImage慢。

4. 关系总结

  • 绘图功能:QPainter是绘图工具,可以在QImage和QPixmap上进行绘图操作。
  • 图像数据:QImage和QPixmap都是用于处理图像数据的类,但它们的用途和优化方向有所不同。QImage提供了像素级别的访问和操作,而QPixmap则优化了屏幕显示性能。
  • 相互转换:QImage和QPixmap之间可以进行相互转换。可以使用QPixmap的toImage()函数将其转换为QImage,或者使用QImage的QPixmap::fromImage()静态函数将其转换为QPixmap。这种转换使得开发者可以根据需要选择最适合当前任务的图像处理类。

综上所述,QPainter、QImage和QPixmap在Qt中共同构成了强大的图像处理和绘图功能体系。它们之间的关系使得开发者可以灵活地选择和使用这些类来满足不同的图像处理和绘图需求。

问题4:不是可以这样比喻 qt6中 QPainter 是画家,QPixmap 是画布 QPen 是画笔 QPainter 这个画家可以使用QPen 这个画笔 在 QPixmap 这个画布上绘制图形

这个比喻非常贴切且易于理解!在Qt6的上下文中,我们可以这样描述这三个类之间的关系:

  • QPainter 确实是“画家”,它负责执行绘制操作,将图形、文本或其他图像绘制到指定的绘图设备(如窗口、图像等)上。QPainter提供了丰富的绘图函数,使得开发者可以像画家一样在绘图设备上进行创作。

  • QPixmap 可以被看作是“画布”,它是专门为屏幕显示而优化的图像表示。QPixmap对象可以作为QPainter的绘图设备,让QPainter在其上进行绘制。就像画家在画布上作画一样,QPainter可以在QPixmap上绘制各种图形和图像。

  • QPen 则是“画笔”,它定义了绘制线条时的样式,包括颜色、宽度、线型(如实线、虚线等)和线帽样式等。通过设置QPen的属性,开发者可以控制QPainter绘制线条时的外观。虽然QPen主要用于绘制线条,但它也间接影响了其他需要线条的图形(如矩形边框、圆形轮廓等)的绘制效果。

因此,你的比喻“QPainter 是画家,QPixmap 是画布,QPen 是画笔,QPainter 这个画家可以使用QPen 这个画笔在QPixmap 这个画布上绘制图形”是非常准确的。这个比喻不仅直观地表达了这三个类之间的关系,还帮助开发者更好地理解它们在Qt6图像处理和绘图功能中的作用。

布局:

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

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

相关文章

机器学习与AI大数据的融合:开启智能新时代

在当今这个信息爆炸的时代&#xff0c;大数据和人工智能&#xff08;AI&#xff09;已经成为推动社会进步的强大引擎。作为AI核心技术之一的机器学习&#xff08;Machine Learning, ML&#xff09;&#xff0c;与大数据的深度融合正引领着一场前所未有的科技革命&#xff0c;不…

电子画册制作的小秘密都在这篇文章了

电子画册作为现代营销和展示的重要工具&#xff0c;已经成为各类企业和个人宣传品的首选。相比传统印刷画册&#xff0c;电子画册不仅节省成本&#xff0c;还能通过多媒体元素增强视觉冲击力&#xff0c;提升用户互动体验。本文将介绍电子画册制作的基础步骤和关键要点&#xf…

电气-伺服(4)CANopen

一、CAN Controller Area Network ,控制器局域网&#xff0c;80年的德国Bosch的一家公司研发可以测量仪器直接的实时数据交换而开发的一款串行通信协议。 CAN发展历史 二、CAN 的osi 模型 CAN特性&#xff1a; CAN 的数据帧 三、CANopen 什么是CANopen CANopen 的网络模型 …

Unity In App Purchasing内购校验

1&#xff0c;利用收据验证混淆器 把后台的key填进去&#xff0c;点击自动生成一些文件 2&#xff0c;代码过滤 using UnityEngine.Purchasing.Security;在IAPManager.cs的 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)增加 #if !UNITY_EDITOR…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;AI边缘流媒体设备展示&#xff08;三&#xff09;赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 &#xff08;四&#xff09;一些注意事项1、开发板…

springboot 篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

ctfshow sql注入

开启其他注入 web221 limit注入 给出查询语句 以及过滤逻辑为空 获取数据库名即可 limit 用于控制返回结果行数 limit后面似乎只能跟PROCEDURE ANALYSE( ) 函数了 PROCEDURE ANALYSE( ) 函数用于分析查询结果的函数 参数是用来控制函数的 这个参数的位置 可以放入报错函数 原…

MySQL—创建查看删除备份恢复数据库

创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…

AI PC(智能电脑)技术分析

一文看懂AI PC&#xff08;智能电脑&#xff09; 2024年&#xff0c;英特尔、英伟达等芯片巨头革新CPU技术&#xff0c;融入AI算力&#xff0c;为传统PC带来质的飞跃&#xff0c;引领智能计算新时代。 2024年&#xff0c;因此被叫作人工智能电脑&#xff08;AI PC&#xff09;…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享

B题 洪水灾害的数据分析与预测 亚太中文赛事本次报名队伍约3000队&#xff0c;竞赛规模体量大致相当于2024年认证杯&#xff0c;1/3个妈杯&#xff0c;1/10个国赛。赛题难度大致相当于0.6个国赛&#xff0c;0.8个妈杯。该比例仅供大家参考。 本次竞赛赛题难度A:B:C3:1:4&…

C语言程序是怎么在计算机中运行起来的

hello.c #include <stdio.h>int main(){printf("hello,world\n");return 0; }这段 C语言程序的代码能被编程人员读懂&#xff0c;但是计算机系统读不懂。C语言、C、java 这些高级编程语言本质上还是人类用的语言而不是计算机用的语言。 为了能在计算机上运行这…

无忧易售功能:刊登页面文本翻译,无缝对接全球买家

每一个词语&#xff0c;每一句话&#xff0c;都承载着产品的灵魂和品牌的故事&#xff0c;无忧易售的刊登页面文本翻译服务&#xff0c;一键操作即可将你的产品介绍、详情或广告文案转化为多语言版本&#xff0c;轻松管理&#xff0c;高效发布。 一、Allegro、OZON、Coupang、…

第7章:Electron文件系统操作(2)

7.2 文件对话框 Electron 提供了 dialog 模块用于显示文件打开和保存对话框。 7.2.1 显示文件打开对话框 主进程代码&#xff1a; const { app, BrowserWindow, ipcMain, dialog } require(electron); const path require(path);let mainWindow;const createMainWindow …

盘点2024年最新鼠标连点器推荐

电脑鼠标连点器是一种可以帮助用户自动化点击操作的小工具&#xff0c;广泛应用于游戏、自动化办公和测试等领域。选择一款合适的鼠标连点器能够提高工作和娱乐的效率&#xff0c;避免重复点击带来的疲劳。小编将为您介绍电脑鼠标连点器的产品特点、推荐几款实用的鼠标连点器并…

一览 Anoma 上的有趣应用概念

撰文&#xff1a;Tia&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News Anoma 的目标是为应用提供通用的意图机器接口&#xff0c;这意味着使用 Anoma&#xff0c;开发人员可以根据意图和分布式意图机编写应用&#xff0c;而不是根据事务和特定状态机进行…

Java增加线程后kafka仍然消费很慢

文章目录 一、问题分析二、控制kafka消费速度属性三、案例描述 一、问题分析 Java增加线程通常是为了提高程序的并发处理能力&#xff0c;但如果Kafka仍然消费很慢&#xff0c;可能的原因有&#xff1a; 网络延迟较大&#xff1a;如果网络延迟较大&#xff0c;即使开启了多线…

新手拍短视频的些许建议

1、尽早行动&#xff0c;拒绝完美主义&#xff0c;有手机就能上车&#xff0c;一开始别花太多时间在打磨细节上。总是要准备好了后再做&#xff0c;就总比别人慢一步&#xff0c;可能永远也追不上了&#xff1b; 2、坚持发&#xff0c;度过难熬的启动期就行&#xff0c;不要走…

启明智显Model3A芯片方案7寸高清触摸屏ZX7D00CM21S:开箱、设置与实操全攻略指南

一、背景 本指南将详细介绍启明智显的Model3A芯片方案下的7寸高清触摸屏ZX7D00CM21S的开箱步骤、基础设置以及实操应用。无论您是电子爱好者、开发者还是工程师&#xff0c;这份指南都能助您快速上手并充分利用这款触摸屏的各项功能。 二、硬件介绍 ZX7D00CM21S 7寸高清触摸屏是…

谷歌正在试行人脸识别办公室安全系统

内容提要&#xff1a; &#x1f9ff;据美国消费者新闻与商业频道 CNBC 获悉&#xff0c;谷歌正在为其企业园区安全测试面部追踪技术。 &#x1f9ff;测试最初在华盛顿州柯克兰的一间办公室进行。 &#x1f9ff;一份内部文件称&#xff0c;谷歌的安全和弹性服务 (GSRS) 团队将…

【android】【adb shell】写一个shell脚本,监听进程pid变化

前言 当前业务&#xff0c;需要写一个脚本&#xff0c;不断监视com.android.phone 进程是否异常死掉 脚本 #!/system/bin/sh last_pid"" current_pid"" while(true){current_pidps -A | grep com.android.phone | awk {print $2}if [ -n "$current…