QML与C++的交互操作
QML旨在通过C ++代码轻松扩展。Qt QML模块中的类使QML对象能够从C ++加载和操作,QML引擎与Qt元对象系统集成的本质使得C ++功能可以直接从QML调用。这允许开发混合应用程序,这些应用程序是通过混合使用QML,JavaScript和C ++代码实现的。除了从QML访问C ++功能的能力之外,Qt QML模块还提供了从C ++代码执行反向和操作QML对象的方法。下面会通过示例来讲解QML与C++的交互是如何实现的。
QML中创建C++对象
使用C ++代码中定义的功能可以轻松扩展QML。由于QML引擎与Qt元对象系统的紧密集成,可以从QML代码访问由QObject派生的类适当公开的任何功能。这使得C ++类的属性和方法可以直接从QML访问,通常很少或无需修改。
QML引擎能够通过元对象系统内省QObject实例。这意味着,任何QML代码都可以访问QObject派生类实例的以下成员:
- 属性(使用Q_PROPERTY注册的属性)
- 方法(需注册为public slots或是标记为Q_INVOKABLE)
- 信号
(此外,如果已使用Q_ENUMS声明枚举,则可以使用枚举。)
通常,无论是否已向QML类型系统注册了QObject派生类,都可以从QML访问它们。但是,如果QML引擎要访问其他类型信息(例如,如果要将类本身用作方法参数或属性,或者要将其中一个枚举类型用于以这种方式使用),那么该类可能需要注册。代码示例有四个文件,QtQuick Empty工程的两个加自定义的Cpp类h和cpp文件。
#ifndef CPPOBJECT_H
#define CPPOBJECT_H#include <QObject>//派生自QObject
//使用qmlRegisterType注册到QML中
class CppObject : public QObject
{Q_OBJECT//注册属性,使之可以在QML中访问--具体语法百度Q_PROPERTYQ_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)Q_PROPERTY(int year READ getYear WRITE setYear NOTIFY yearChanged)public:explicit CppObject(QObject *parent = nullptr);//通过Q_INVOKABLE宏标记的public函数可以在QML中访问Q_INVOKABLE void sendSignal();//功能为发送信号//给类属性添加访问方法--myNamevoid setName(const QString &name);QString getName() const;//给类属性添加访问方法--myYearvoid setYear(int year);int getYear() const;signals://信号可以在QML中访问void cppSignalA();//一个无参信号void cppSignalB(const QString &str,int value);//一个带参数信号void nameChanged(const QString name);void yearChanged(int year);public slots://public槽函数可以在QML中访问void cppSlotA();//一个无参槽函数void cppSlotB(const QString &str,int value);//一个带参数槽函数private://类的属性QString myName;int myYear;
};#endif // CPPOBJECT_H
在头文件中,我定义了信号和public槽函数,以及Q_INVOKABLE宏标记的public函数,还通过Q_PROPERTY注册了两个属性,这些方法和属性之后都可以在QML中进行访问。
#include "CppObject.h"#include <QDebug>CppObject::CppObject(QObject *parent): QObject(parent),myName("none"),myYear(0)
{}void CppObject::sendSignal()
{//测试用,调用该函数后发送信号qDebug()<<"CppObject::sendSignal";emit cppSignalA();emit cppSignalB(myName,myYear);
}void CppObject::setName(const QString &name)
{qDebug()<<"CppObject::setName"<<name;if(myName!=name){qDebug()<<"emit nameChanged";myName=name;emit nameChanged(name);}
}QString CppObject::getName() const
{qDebug()<<"CppObject::getName";return myName;
}void CppObject::setYear(int year)
{qDebug()<<"CppObject::setYear"<<year;if(year!=myYear){qDebug()<<"emit yearChanged";myYear=year;emit yearChanged(myYear);}
}int CppObject::getYear() const
{qDebug()<<"CppObject::getYear";return myYear;
}void CppObject::cppSlotA()
{qDebug()<<"CppObject::cppSlotA";
}void CppObject::cppSlotB(const QString &str, int value)
{qDebug()<<"CppObject::cppSlotB"<<str<<value;
}
为了测试方便,给每个函数都加了一个打印语句,当调用sendSignal函数时将会emit两个信号,稍后会在QML中调用该函数。
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "CppObject.h"int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//qmlRegisterType注册C++类型至QML//arg1:import时模块名//arg2:主版本号//arg3:次版本号//arg4:QML类型名qmlRegisterType<CppObject>("MyCppObject",1,0,"CppObject");QQmlApplicationEngine engine;//也可以注册为qml全局对象//engine.rootContext()->setContextProperty("cppObj",new CppObject(qApp));engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}
通过使用qmlRegisterType,将刚才定义的QObject派生类注册到QML中。
import QtQuick 2.9
import QtQuick.Window 2.9
//引入我们注册的模块
import MyCppObject 1.0Window {id: rootvisible: truewidth: 500height: 300title: qsTr("QML调用Cpp对象:by 龚建波1992")color:"green"signal qmlSignalAsignal qmlSignalB(string str,int value)//鼠标点击区域MouseArea{anchors.fill: parentacceptedButtons: Qt.LeftButton | Qt.RightButton//测试时点击左键或右键onClicked: {if(mouse.button===Qt.LeftButton){console.log('----qml 点击左键:Cpp发射信号')cpp_obj.name="gongjianbo" //修改属性会触发set函数,获取值会触发get函数cpp_obj.year=1992cpp_obj.sendSignal() //调用Q_INVOKABLE宏标记的函数}else{console.log('----qml 点击右键:QML发射信号')root.qmlSignalA()root.qmlSignalB('gongjianbo',1992)}}}//作为一个QML对象CppObject{id:cpp_obj//也可以像原生QML对象一样操作,增加属性之类的property int counts: 0onYearChanged: {counts++console.log('qml onYearChanged',counts)}onCountsChanged: {console.log('qml onCountsChanged',counts)}}//组件加载完成执行Component.onCompleted: {//关联信号与信号处理函数的方式同QML中的类型//Cpp对象的信号关联到Qml//cpp_obj.onCppSignalA.connect(function(){console.log('qml signalA process')})cpp_obj.onCppSignalA.connect(()=>console.log('qml signalA process')) //js的lambdacpp_obj.onCppSignalB.connect(processB)//Qml对象的信号关联到Cpproot.onQmlSignalA.connect(cpp_obj.cppSlotA)root.onQmlSignalB.connect(cpp_obj.cppSlotB)}//定义的函数可以作为槽函数function processB(str,value){console.log('qml function processB',str,value)}
}
注册之后就能直接在QML中使用刚才定义的C++类型了,并且可以像QML定义的类型一样进行操作,如信号槽关联、属性绑定等。
这个示例很简单,点击鼠标左键调用CppObj的sendSignal函数来发送信号,QML处理;点击鼠标右键QML发送信号,CppObj处理,下面是操作结果:
可以看到QML成功的访问了CppObj的属性和方法,并能进行信号槽的关联。
第二个例子:C++中加载QML对象
所有QML对象类型都是源自QObject类型,无论它们是由引擎内部实现还是第三方定义。这意味着QML引擎可以使用Qt元对象系统动态实例化任何QML对象类型并检查创建的对象。
这对于从C ++代码创建QML对象非常有用,无论是显示可以直观呈现的QML对象,还是将非可视QML对象数据集成到C ++应用程序中。一旦创建了QML对象,就可以从C ++中检查它,以便读取和写入属性,调用方法和接收信号通知。
可以使用QQmlComponent或QQuickView来加载QML文档。QQmlComponent将QML文档作为为一个C++对象加载,然后可以从C++ 代码进行修改。QQuickView也可以这样做,但由于QQuickView是一个基于QWindow的派生类,加载的对象也将可视化显示,QQuickView通常用于将一个可视化的QML对象集成到应用程序的用户界面中。
import QtQuick 2.9Item{id: rootwidth: 250height: 250//自定义属性 --cpp可以访问property string msg: "GongJianBo1992"//自定义信号 --可以触发cpp槽函数signal qmlSendMsg(string arg1,string arg2)Rectangle {anchors.fill: parentcolor: "green"objectName: "rect" //用于cpp查找对象}MouseArea {anchors.fill: parentonClicked: {console.log("qml 点击鼠标, 发送信号 qmlSendMsg")root.qmlSendMsg(root.msg,"myarg2")}}onHeightChanged: console.log("qml height changed")onWidthChanged: console.log("qml width changed")//QML中的方法可以被cpp调用,也可以作为槽函数function qml_method(val_arg){console.log("qml method runing",val_arg,"return ok")return "ok"}//注意槽函数参数为var类型function qmlRecvMsg(arg1,arg2){console.log("qml slot runing",arg1,arg2)}
}
在QML中定义了一些属性和方法等,用于测试。
#ifndef CPPOBJECT_H
#define CPPOBJECT_H#include <QObject>
#include <QDebug>class CppObject : public QObject
{Q_OBJECT
public:explicit CppObject(QObject *parent = Q_NULLPTR):QObject(parent){}signals://信号 --用来触发qml的函数//注意参数为var类型,对应qml中js函数的参数类型void cppSendMsg(const QVariant &arg1,const QVariant &arg2);public slots://槽函数 --用来接收qml的信号void cppRecvMsg(const QString &arg1,const QString &arg2){qDebug()<<"CppObject::cppRecvMsg"<<arg1<<arg2;qDebug()<<"emit cppSendMsg";emit cppSendMsg(arg1,arg2);}
};#endif // CPPOBJECT_H
Cpp中定义了一个槽函数,用来接收QML对象的信号
#include <QGuiApplication>
#include <QQmlProperty>
#include <QQuickView>
#include <QQuickItem>
#include <QMetaObject>
#include <QDebug>#include "CppObject.h"int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//可以用QQmlComponent\QQuickView\QQuickWidget的C++代码加载QML文档//QQuickView不能用Window做根元素QQuickView view(QUrl("qrc:/main.qml"));view.show();//获取到qml根对象的指针QObject *qmlObj=view.rootObject();/*文档如是说:应该始终使用QObject::setProperty()、QQmlProperty或QMetaProperty::write()来改变QML的属性值,以确保QML引擎感知属性的变化。*///【1】//通过QObject设置属性值qDebug()<<"Cpp set qml property height";//qmlObj->setProperty("height",300);QQmlProperty(qmlObj,"height").write(300);//通过QObject获取属性值qDebug()<<"Cpp get qml property height"<<qmlObj->property("height");//任何属性都可以通过C++访问qDebug()<<"Cpp get qml property msg"<<qmlObj->property("msg");//【2】QQuickItem *item=qobject_cast<QQuickItem*>(qmlObj);//通过QQuickItem设置属性值qDebug()<<"Cpp set qml property width";item->setWidth(300);//通过QQuickItem获取属性值qDebug()<<"Cpp get qml property width"<<item->width();//【3】//通过objectName访问加载的QML对象//QObject::findChildren()可用于查找具有匹配objectName属性的子项QObject *qmlRect=qmlObj->findChild<QObject*>("rect");if(qmlRect){qDebug()<<"Cpp get rect color"<<qmlRect->property("color");}//【4】//调用QML方法QVariant val_return; //返回值QVariant val_arg="GongJianBo"; //参数值//Q_RETURN_ARG()和Q_Arg()参数必须制定为QVariant类型QMetaObject::invokeMethod(qmlObj,"qml_method",Q_RETURN_ARG(QVariant,val_return),Q_ARG(QVariant,val_arg));qDebug()<<"QMetaObject::invokeMethod result"<<val_return; //qml函数中返回“ok”//【5】//关联信号槽CppObject cppObj;//关联qml信号与cpp槽//如果信号参数为QML对象类型,信号用var参数类型,槽用QVariant类型接收QObject::connect(qmlObj,SIGNAL(qmlSendMsg(QString,QString)),&cppObj,SLOT(cppRecvMsg(QString,QString)));//关联cpp信号与qml槽//qml中js函数参数为var类型,信号也用QVariant类型QObject::connect(&cppObj,SIGNAL(cppSendMsg(QVariant,QVariant)),qmlObj,SLOT(qmlRecvMsg(QVariant,QVariant)));//此外,cpp信号也可以关联qml信号return app.exec();
}
然后就把文档中的东西测试了下,操作起来很简单。不过相对于QML中使用C++对象来说,感觉作用没那么大,因为一般把QML嵌入到Widgets中才会做这些操作,但是混合两个框架很多坑。下面是测试输出结果:
相关文章:
QML与C++的交互操作
QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作,QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序,这些应用程序是通过混合使用QML,JavaScript和C 代码实现的。除了从QML访问…...
Java_理解方法调用
理解方法调用 首先什么是隐式参数 --->隐式参数是调用该方法的对象本身。 接下来方法的名称和参数列表被称为方法的签名(signature)。在Java中,方法的签名由方法的名称和参数列表组成,用于唯一标识一个方法。返回类型不是签名的…...
Mysql 性能分析(慢日志、profiling、explain)、读写分离(主从架构)、分库分表(垂直分库、垂直分表、水平分表)
查看系统性能参数 一条sql查询语句在执行前,需要确定查询执行计划,如果存在多种执行计划的话,mysql会计算每个执行计划所需要的成本,从中选择 成本最小的一个作为最终执行的执行计划 想要查看某条sql语句的查询成本,可…...
获取Linux内核源码
在嵌入式平台上做Linux开发的时候,我们用的kernel都是芯片厂家移植到自家平台上的,但是最初的原生Linux内核的源码是从哪里来的呢?下面我们介绍一下怎么获取原生的Linux源码。 从Linux社区获取内核kernel源码 Linux社区的官方网站是 https:…...
【Maven教程】(四)坐标与依赖:坐标概念,依赖配置、范围、传递性和最佳实践 ~
Maven 坐标与依赖 1️⃣ 什么是Maven 坐标2️⃣ 坐标详解3️⃣ 依赖的配置4️⃣ 依赖范围5️⃣ 传递性依赖6️⃣ 依赖调解7️⃣ 可选依赖8️⃣ 最佳实践8.1 排除依赖8.2 归类依赖8.3 优化依赖 🌾 总结 正如前面文章所述,Maven 的一大功能是管理项目依赖…...
Java“牵手”京东店铺所有商品API接口数据,通过店铺ID获取整店商品详情数据,京东店铺所有商品API申请指南
京东平台店铺所有商品数据接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取京东整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台上商品详…...
TuyaOS开发学习笔记(1)——NB-IoT开发搭建环境、编译烧写(MT2625)
一、搭建环境 1.1 官方资料 TuyaOS 1.2 安装VMware 官网下载:https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0 百度网盘:https://pan.baidu.com/s/1oN7H81GV0g6cD9zsydg6vg 提取…...
Css 将div设置透明度,并向上移50px,盖住上面的元素一部分
可以使用CSS中的opacity和position属性来实现。 首先,将div的opacity属性设置为小于1的值,比如0.5,这样就可以设置透明度了。其次,将div的position设置为relative,然后再将它向上移动50px,即可盖住上面的元…...
HTTPS安全通信和SSL Pinning
随着互联网的迅速发展,网络通信安全问题日益凸显。在这一背景下,HTTPS作为一种加密通信协议得到了广泛应用,以保障用户的数据隐私和信息安全。本文将介绍HTTPS的基本原理、发展历程,以及与之相关的中间人攻击和防护方法。 1. HTT…...
PHP自己的框架PDO数据表前缀、alias、model、table、join方法实现(完善篇九--结束)
一、实现功能,数据表前缀、alias、model、table、join方法实现 二、表前缀实现 1、config.php增加表前缀 DB_PEX>fa_,//数据库前缀 2、增加表前缀方法function.php function model($table){$modelnew ModelBase($table,config("DB_PEX"));return $m…...
华为OD:敏感字段加密
题目描述: 给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线_进行分割; 3、可以通过两个双引号”"来标识包含下划线…...
IDEA新建SpringBoot项目时启动编译报错:Error:java: 无效的源发行版: 17
文章目录 原因检查解决步骤修改jdk修改SpringBoot版本 原因 出现这种错误的原因可能是: 本机默认使用(编译)的jdk与该项目所使用的jdk版本不同。 jdk版本不适用于这个Idea,很典型的一个例子就是使用的Idea是2020的,而…...
【云原生进阶之PaaS中间件】第一章Redis-2.3.3集群模式
1 集群模式 Redis集群是一个提供在多个Redis节点之间共享数据的程序集。它并不像Redis主从复制模式那样只提供一个master节点提供写服务,而是会提供多个master节点提供写服务,每个master节点中存储的数据都不一样,这些数据通过数据分片的方式被自动分割到不同的master节点上…...
游戏发行商能够提供什么服务?
游戏发行商可以为游戏开发者提供广泛的服务,以帮助他们将游戏成功地引入市场并取得更好的业绩。以下是游戏发行商可能提供的一些服务: 市场营销和宣传:发行商通常具有丰富的市场营销经验,可以制定并执行有效的宣传和营销策略。他们…...
Linux 多进程解决客户端与服务器端通信
写一个服务器端用多进程处理并发,使两个以上的客户端可以同时连接服务器端得到响应。每当接受一个新的连接就fork产生一个子进程,让子进程去处理这个连接,父进程只用来接受连接。 与多线程相比的不同点:多线程如果其中一个线程操…...
Scala的模式匹配
Scala的模式匹配 Scala 中的模式匹配类似于Java 中的 switch 语法:下面是java中switch代码: int i 10 switch (i) {case 10 :System.out.println("10");break; case 20 :System.out.println("20");break; default :System.out.pr…...
HttPClient简介及示例:学习如何与Web服务器进行通信
文章目录 前言一、引入依赖二、使用步骤1.创建被调用者2.创建调用者三、结果被调用者服务:调用者服务: 总结 前言 欢迎来到本篇博客,这是一个关于HttPClient的入门案例的指南。🎉 在今天的网络世界中,与服务器进行数据…...
STS4 New 安装Spring Bean Configuration File
背景介绍 在创建spring项目后,如果想想创建spring bean Configuration的时候,发下菜单没有这个选项,需要通过下载Spring Roo插件可满足该操作。 参考案例 参考地址: STS4 New 菜单没有Spring Bean Configuration File选项_SQZHA…...
Java经典面试题(异或运算)
不爱生姜不吃醋⭐️⭐️⭐️ 🌻如果本文有什么错误的话欢迎在评论区中指正哦💗 🌻看完之后觉得不错的话麻烦动动小手点个赞赞吧👍 🌻与其明天开始,不如现在行动!💪 🌻大家…...
No primary or single unique constructor found for interface java.util.List
1.问题描述 前端 请求的参数 是 query形式, 参数在url中 报错信息: java.lang.IllegalStateException: No primary or single unique constructor found for interface java.util.List2.解决办法 controller中的 请求方法 参数 加上 RequestParam...
C#关于WebService中File.Exists()处理远程路径的异常记录
目录 前言方案一打开网站对应的程序池的高级设置按下图步骤设置凭据重启网站若方案一未能解决,请继续尝试方案二👇 方案二从控制面板进入到 凭据管理器为windows凭据添加凭据点击**Windows凭据**,并点击**添加Windows凭据**键入远程路径的地址…...
JavaWeb_LeadNews_Day10-Xxljob, Redis实现定时热文章
JavaWeb_LeadNews_Day10-Xxljob, Redis实现定时热文章 xxl-job概述windows部署调度中心docker部署调度中心 xxl-job入门案例xxl-job分片广播热点文章定时计算思路分析具体实现热文章计算定时计算 查询文章接口改造来源Gitee xxl-job概述 windows部署调度中心 运行 xxl-job\do…...
【WebRTC---源码篇】(二:二)视频源VideoSourceBase
作用 这个类继承自VideoSourceInterface<webrtc::VideoFrame>模板类,并且可以处理webrtc::VideoFrame class VideoSourceBase : public VideoSourceInterface<webrtc::VideoFrame> 重要成员变量 struct SinkPair {SinkPair(VideoSinkInterface<webrtc::Vid…...
Linux_8_磁盘存储和文件系统
1 磁盘结构 1.1 设备文件 一切皆文件: open(),read(),write(),close() 设备文件:关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信 设备号码: 主设备号 major number,标识设备类型 次设备号 minor number,标识同一类型下的不同设备 设备类型:…...
VS + QT 封装带UI界面的DLL
一、创建编译DLL的项目 1.新建Qt Class Liabrary 2.新建项目,选择Qt Widgets Class 3.新建C类,可以在此类里面写算法函数用于调用。 4.下面是添加完Qt窗体类和C类之后的项目截图 5.修改头文件并编译 将uidemo_global.h中的ifdef内容复制到dialog.h上…...
逆向工程-架构真题(二十)
结构化程序设计采用自顶向下、逐步求精及模块化程序设计方法,通过()三种基本控制结构可以构造出任何单入口单出口程序。 顺序、选择和嵌套顺序、分支和循环分支、并发和循环跳转、选择和并发 答案:B 解析: 结构化设…...
Zookeeper 入门
第 1 章 Zookeeper 入门 1.1概述 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将…...
记录--前端使用a链接下载内容增加loading效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 问题描述:最近工作中出现一个需求,纯前端下载 Excel 数据,并且有的下载内容很多,这时需要给下载增加一个 loading 效果。 代码如下: // util…...
如何获取用户的ip地址
用户的 IP 地址可能会被隐藏或者修改,例如使用代理服务器、VPN 等工具,这样就无法准确获取用户的真实 IP 地址。 除了以上特殊情况,一般情况下 用户访问可能会经过一下链路 : 前端—>nginx—>网关—>服务 。 一般情况下后…...
单片机-控制按键点亮LED灯
1、按键电路图 定义四个按键引脚 1、按键按下 为 输入为低电平 2、按键不按下 IO有上拉电阻,为高电平 // 定义 按键的 管教 sbit KEY1 P3^1; sbit KEY2 P3^0; sbit KEY3 P3^2; sbit KEY4 P3^3; 2、LED灯电路图 LED 输出高电平为亮 // 定义LED灯 管教 sbit LED1…...
广州企立科技做网站/品牌宣传推广方案
洛谷 P1451 求细胞数量 题解 洛谷 P1451 问题描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<m,n<100) input 输入一个整数 m , n ( m 行…...
网站建设 淄博 兼职/百度关键词价格怎么查询
as tips部分和自己验证 输入sout然后按tab键: System.out.println(); 快速打开一个class类 : Ctrl N 查看什么地方调用了某个方法: Alt F7 (也可以试试:Ctrl Alt F7) 查看某个方法定义的位置&#…...
c 网站开发需要什么/企业网站运营推广
目录: 1、samba服务介绍 2、 安装samba服务和客户端 3、samba配置文件详解 4、配置实例 5、客户端挂载与测试 6、samba排错 1、Samba服务介绍 Samba 最先在Linux 和Windows 两个平台之间架起了一座桥梁,正是由于Samba 的出现,我们可以在Linux…...
网站建设的内容策略/郑州网站seo顾问
# -auth组件 # -auth是什么? # -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... # -怎么用? # -(1)先创建超级用户: # -python3 manage.py createsuperuser # -输入用户名,邮箱(…...
html5网站建设方案/百度竞价推广怎么做
<script type"text/javascript">//正常版 // (function(){ // alert(好)//返回加 // })()(function(){alert(好好)}()); //正常版不能同时出现(如果一起出现了下面也无法执行了,二者出现一个就可正常运行)//特殊版 fu…...
类似58同城的网站怎么做/在哪里做推广效果好
Jstat是JDK中提供的一个简单实用工具,用于提供与JVM性能相关的统计信息,例如垃圾收集和编译活动。 jstat的主要优势在于,它可以在运行JVM且无需任何先决条件的情况下动态捕获这些指标。 那是什么意思? 例如,如果要捕获…...