Qt不错的学习网址:

http://www.cnblogs.com/findumars/p/5529526.html

----------------------------------------------------

IE内核,qt调用js;qt写com组件,html就可以调用qt

可以百度 QAxBindable  会搜索到比较有用的文章

http://blog.csdn.net/csxiaoshui/article/details/47333989

http://blog.csdn.net/csxiaoshui/article/details/48000885

http://blog.csdn.net/csxiaoshui/article/details/50735018

http://blog.csdn.net/jxd9955/article/details/30260725

ui->axWidget->setControl("Shell.Explorer");

ui->axWidget->setObjectName(QString::fromUtf8("WebBrowser"));
ui->axWidget->setFocusPolicy(Qt::StrongFocus);
//去边框
ui->axWidget->setWindowFlags(Qt::FramelessWindowHint);
ui->axWidget->setStyleSheet("QGraphicsView{border:0px;}");


ui->axWidget->dynamicCall("Navigate(constQString&)",QString("file:///D:/proj/m5/m5/baidu_map_new.html"));

IWebBrowser2*webBrowser=;

ui->axWidget->queryInterface(IID_IWebBrowser2,(void**)&webBrowser);

if(webBrowser)
{
VARIANT_BOOLresult;
HRESULTbusy=webBrowser->get_Busy(&result);

if(VARIANT_TRUE==result)
{

}
}

ui->axWidget->close();
ui->axWidget->show();

+++++++++++++++++++++++++++++++++++++++++++
调用js函数
voidMainWindow::SetLocation(std::wstringx,std::wstringy,std::wstringstr)
{
if(QString::fromStdWString(x).trimmed().isEmpty()||
QString::fromStdWString(y).trimmed().isEmpty())
{
QMessageBox::information(this,QString("NOTICE"),
#ifdefENGLISH_
QString("Targetaddressisempty!"));
#else
QString("目标地址为空!"));
#endif//ENGLISH_

return;
}

QAxObject*document=ui->axWidget->querySubObject("Document");
IHTMLDocument2*doc2;
if(document!=NULL)
{
document->queryInterface(QUuid(IID_IHTMLDocument2),(void**)&doc2);
}

if(doc2)
{
IHTMLWindow2*win2=NULL;
if(doc2->get_parentWindow(&win2)==S_OK)
{
WCHARlocationInfo[MAX_PATH]={};
wsprintf(locationInfo,L"setLocation(%s,%s,%s)",x.c_str(),y.c_str(),str.c_str());

BSTRs1=SysAllocString(locationInfo);
BSTRs2=SysAllocString(L"JavaScript");
VARIANTret;
if(win2!=NULL)
{
win2->execScript(s1,s2,&ret);
}

SysFreeString(s2);
SysFreeString(s1);
}
}
}

------------------------------------------------------------------------------

QT5 与JS交互不错的文章:

http://blog.csdn.net/d7185540/article/details/52896531

http://blog.csdn.net/sharetm/article/details/55260207

---------------------------------------------------------------------------

Qt之QtScript(一)

http://blog.csdn.net/liuhongwei123888/article/details/6162159

http://blog.csdn.net/styyzxjq2009/article/details/8364545

-----------------------------------------------------------------------------------

WebView与JS

这种用法很少见:

http://www.cnblogs.com/ziqiuqiandao/archive/2012/12/29/2838652.html

可以获取到html元素的值:

  1. QWebFrame *frame = ui->webView->page()->mainFrame();
  2. QWebElement userNameEle = frame->findFirstElement("#userName");
  3. QWebElement passwordEle = frame->findFirstElement("#password");
  4. QString userName = userNameEle.evaluateJavaScript("this.value").toString();
  5. QString password = passwordEle.evaluateJavaScript("this.value").toString();

http://blog.csdn.net/liuhongwei123888/article/details/6137094

QT分析之WebKit http://www.cnblogs.com/lfsblack/p/5278777.html 对WebKit进行了详细的讲解,

http://www.cnblogs.com/findumars/p/5529526.html可以将QT的属性值暴露给html文件。

大众用法:

QString strFunc(tr("locateCity('南京', 11);"));

m_pWebView->page()->mainFrame()->evaluateJavaScript(strFunc);

几个注意点:

QWebView为何有些网页显示不了:

1、网页是https协议的,使用SSL加密连接了。你的Qt库集成了openssl模块吗?如果没有,要-openssl开关重编QtNetwork库。如果有,连接webView->page()->networkAccessManager()的sslErrors信号,调用QNetworkReply的ignoreSslErrors函数,然后把libeay32.dll和ssleay32.dll两个文件和程序放到一起。

2、把 qt-create中的 ssleay32.dll 和 libeay32.dll 复制到 qt sdk的 bin目录下面

在学习Qt,做了个浏览器demo,没搞懂对https是怎么支持的?我开发的时候用的机器所有https网站都正常显示,后来拿到另一台机器上,全是空白页。网上有说是ssl握手产生错误的问题,我把代码搞到后一台机子上写了发现还是不行,根本没收到sslerror的signal。用其它浏览器都是正常打开,不明白为什么?

是不是libeay32.dll和ssleay32.dll缺了?

是因为这2个dll,但是电脑里是有的,其他程序都能找到这个路径就是我自己搞的不行,后来把openssl一起打包了。

QWebView直接load可以打开https网页,网页内的大多数的按钮点击却无反应
NetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData)里可以看到有请求返回,
但WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)却收不到请求。

1、

有没有试过调用QWebPager的setLinkDelegationPolicy函数,我之前有碰到过点击链接不处理的问题,是因为没有调用这个函数。
ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);

3、实在不行,参考方案:最终还是QT整合MFC的CHtmlView来做

/* 开启JavaScript支持 */  好像不是必须的!!

QWebSettings *pWebSettings = m_pWebView->page()->settings();

pWebSettings->setAttribute(QWebSettings::JavascriptEnabled,true);

/* 建立信号与槽, 每次载入html时发送段信号 */  必须要!!!

connect(m_pWebView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),

this,SLOT(addObjectToJs()));

Qt代码里先尝试在javaScriptWindowObjectCleared信号对应的槽里调用,结果失败了:

connect(ui.webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
           
this, SLOT(populateJavaScriptWindowObject()));
...
void FormExtractor::populateJavaScriptWindowObject()
{
   
ui.webView->page()->mainFrame()->evaluateJavaScript("tryalert();");
}

是因为这个信号发出得太早了,页面还没有完全载入。需要在后面调用。最好是响应loadFinished(bool)信号:
connect(ui.webView->page()->mainFrame(),
SIGNAL(loadFinished(bool)),
           
this, SLOT(callFunction()));
...
void FormExtractor::callFunction()
{
   
ui.webView->page()->mainFrame()->evaluateJavaScript("tryalert();");
}

QWebview控件

该控件是用于在Qt中显示网页的控件,一般而言会将contextMenuPolicy属性设置为NoContextMenu隐藏系统为其提供的默认右键菜单

<1>. 加载网页:

1
2
3
ui->webViewCut->load(QUrl("http://www.baidu.com"));
//如果是本地网页,必须使用file:///的前缀作为网页地址
ui->webViewCut->load(QUrl("file:///c:/test.html "));

<2>. Qt代码中调用QWebview加载的网页中的js函数:

1
2
3
4
5
6
7
8
9
10
//先作如下设置
ui->webViewCut->page()->setForwardUnsupportedContent(true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::JavaEnabled, true);
ui->webViewCut->page()->settings()->setAttribute(QWebSettings::AutoLoadImages, true);
 
//然后在QWebview的loadFinished槽函数中调用js,该槽函数表示网页已经加载完毕
QString js = QString("alert(\'hello Qt!\')");
ui->webViewCut->page()->mainFrame()->evaluateJavaScript(js);

<3>. 在QWebview加载的html的js代码中调用Qt的函数:

默认情况下在QwebViewCut中的网页里面的js不能直接调用Qt中的相关功能,这涉及到安全性问题。要满足js中调用Qt的功能必须满足下面的条件:

在Qt中暴露一个对象给js,然后js就可以在网页中直接使用这个对象以及该对象的[特定]函数,要求是被暴露Qt对象必须继承自QObject类,并且在js中调用这个暴露的对象的成员函数的定义是有要求的,该对象的满足下面的要求的成员函数都可以直接被js调用:

1.必须是该对象的公共函数,并且在函数声明前面添加Q_INVOKABLE修饰,例如:

1
2
public :
 Q_INVOKABLE int TestQt();

2.如果该函数被声明成一个public slot 也可以不添加Q_INVOKABLE修饰:

1
2
public slots:
  void TestQt();

个人认为第一种方法更好,因为可以设置返回值,而Qt的槽函数是没有返回值的,都是返回void,只需要调用this->ui->webViewCut->page()->mainFrame()->addToJavaScriptWindowObject("QtObj", this); 就可以将一个Qt对象,也就是这里传递的this代表的对象,当然也可以直接传递其他对象指针,暴露给网页中的javascript,网页中的javascript在调用的时候可以直接使用 QtObj 去引用我们的Qt对象,以及通过QtObj去直接调用符合条件的Qt对象的成员函数。

那么this->ui->webViewCut->page()->mainFrame()->addToJavaScriptWindowObject("QtObj", this);代码在什么时候执行呢? 推荐是在QWebFrame的信号javaScriptWindowObjectCleared发出的时候执行,所以我们可以在当前UI界面类的构造函数中添加下面的代码:

1
2
connect(ui->webViewCut->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
    this, SLOT(populateJavaScriptWindowObject()));

然后在处理javaScriptWindowObjectCleared()信号的槽函数中实现上述暴露功能:

1
2
3
4
void MainWindow::populateJavaScriptWindowObject()
{
   ui->webViewCut->page()->mainFrame()->addToJavaScriptWindowObject("QtObj"this);
}

根据Qt文档上对该信号的描述javaScriptWindowObjectCleared()这个信号会在我们调用QwebViewCut::load()加载新的url之前就触发,我们在这个时候去处理这个信号,将我们需要暴露的Qt对象暴露给即将载入的网页

<4>. 将Qt的属性暴露出去供js调用,使用如下方法:

1
Q_PROPERTY(int Qtvalue READ testValue WRITE setTestValue)

将上面的语句加入到类的声明中,在private块下面就可以,最后不需要以分号结尾,例如:

1
2
private:
 Q_PROPERTY(int Qtvalue READ testValue WRITE setTestValue)

这一行的作用是将属性 Qtvalue 注册到Qt的元对象系统中,在js中可以通过名字Qtvalue来访问该属性,但在js中访问该属性的时候假设Qt暴露给js的对象为QtObj,那么在js中可以这样访问该属性:

1
2
QtObj.Qtvalue = 10; //设置该属性的时候会调用void setTestValue(int)
alert(QtObj.Qtvalue) //获取该属性的时候会调用 int testValue()

Q_PROPERTY(int Qtvalue READ testValue WRITE setTestValue)的结构如下:

1
2
Q_PROPERTY( 类型   属性名    READ     返回属性值的函数    WRITE     设置属性值的函数 )
            int   Qtvalue           int testValue()          void setTestValue(int)

也就是说在js中我们可以直接使用Qtvalue,当获取Qtvalue的值的时候会自动调用暴露对象的 int testValue() 函数 ,Qt规定其返回值必须与Q_PROPERTY语句中指定的类型相同,并且必须没有参数。当我们为Qtvalue设置值的时候会调用暴露对象的void setTestValue(int)函数,该函数必须有一个int类型的参数(类型也必须与前面Q_PROPERTY语句中指定的类型相同),并且不能有返回值。

经过实验int testValue()void setTestValue(int)函数的声明在private区域也可以,好像无所谓。其实这两个函数的名字是可以随意定的,对js暴露的属性名是Qtvalue,当访问Qtvalue属性的时候,会自动调用Q_PROPERTY声明中READ后面指定的函数去获取值,并且调用WRITE后面指定的函数去设置值,而不在乎这两个函数的名字。

另外这两个函数获取的值或者设置的值从哪里得来呢,我们可以在Qt对象中定义一个私有变量来保存这个值,而这个私有变量的名字是无所谓的,甚至如果需要的话,我们也不必保存这个值,直接在函数testValue里面返回一个常量值,也就是说是否应该定义一个私有变量来保存Qtvalue相关联的属性值,这个也不是必须的。

更多Qt QWidget与js的交互可以在Qt文档中搜索  The Qt WebKit Bridge关键字,其实Q_PROPERTY并不是专用于暴露属性给js的,Q_PROPERTY是Qt元对象系统的一部分。

<5>. 如果在QWebview加载的网页中有Flex应用程序,并且Qt中调用该QWebview加载的网页中的js函数中需要调用flex程序暴露给js的接口,那么还需要作如下设置:

"%appdata%\Macromedia\Flash Player\#Security\FlashPlayerTrust\"路径下新建xxx.cfg文件,将当前flex应用程序所在位置(也就是swf文件所在的目录)填写到该文件中即可,该xxx.cfg的名字是无所谓的,随便什么名字,在xxx.cfg文件中指定的目录路径中的swf文件的运行是被信任的。xxx.cfg文件中可以指定多个目录,每行一个。实际上%appdata%\Macromedia\Flash Player\#Security\FlashPlayerTrust\路径下也可以有多个文件名不同的cfg文件。xxx.cfg文件中指定的目录实际上可以直接指定为根目录,例如swf文件的路径是F:/xxx/yyy/zzz/test.swf,那么我们新建的xxx.cfg中的内容的第一行可以直接指定为F:/即可。

其实FlexBuilder在建立项目的时候,其生成的swf所在的目录都被添加到了%appdata%\Macromedia\Flash Player\#Security\FlashPlayerTrust\下面的flashbuilder.cfg中了,所以使用FlexBuilder调试项目的时候,运行的swf都是被信任的。

js调用QT时,传递参数类型:

注册:

m_pWebView->page()->mainFrame()->addToJavaScriptWindowObject("m5_js",this);

js调用qt的函数

void m5_js::setInfor(const QString a)

{

ui.btadd->setText(a);

}

          js函数:  

function attribute() {

var p = marker.getPosition();

var ll = p.lng.toString();

m5_js.setInfor(ll)

//m5_js.setInfor(p.lng.toString())

//获取marker的位置

alert("marker的位置是" + p.lng + "," + p.lat);

}

Qt代码里先尝试在javaScriptWindowObjectCleared信号对应的槽里调用,结果失败了:

connect(ui.webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
           
this, SLOT(populateJavaScriptWindowObject()));
...
void FormExtractor::populateJavaScriptWindowObject()
{
   
ui.webView->page()->mainFrame()->evaluateJavaScript("tryalert();");
}

是因为这个信号发出得太早了,页面还没有完全载入。需要在后面调用。最好是响应loadFinished(bool)信号:
connect(ui.webView->page()->mainFrame(),
SIGNAL(loadFinished(bool)),
           
this, SLOT(callFunction()));
...
void FormExtractor::callFunction()
{
   
ui.webView->page()->mainFrame()->evaluateJavaScript("tryalert();");
}

Qt与JS(三)的更多相关文章

  1. Qt调用JS

    转自: 一. 简介 Qt提供了本地C++对象与JavaScript的无缝集成,可以进行本地与web混合应用开发.利用Qt的Webkit集成与QtNetwork模块,可以自由的混合JavaScript. ...

  2. js介绍,js三种引入方式,js选择器,js四种调试方式,js操作页面文档DOM(修改文本,修改css样式,修改属性)

    js介绍 js运行编写在浏览器上的脚本语言(外挂,具有逻辑性) 脚本语言:运行在浏览器上的独立的代码块(具有逻辑性) 操作BOM 浏览器对象盒子 操作DOM 文本对象 js三种引入方式 (1)行间式: ...

  3. 一天带你入门到放弃vue.js(三)

    自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...

  4. Qt计算器开发(三):执行效果及项目总结

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guodongxiaren/article/details/26046543 执行效果 project ...

  5. jquery动态加载js三种方法实例

    这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getScript(\"test.js\" ...

  6. JS三个编码函数和net编码System.Web.HttpUtility.UrlEncode比较

    JS三个编码函数和net编码比较 总结 1.escape.encodeUri.encodeUriComponent均不会对数字.字母进行编码.2.escape:对某些字符(如中文)进行unicode编 ...

  7. qt学习(三):鼠标图标改变

    qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #i ...

  8. JS三个事件绑定方法

    1. JS三个事件绑定方法 1.1. 使用html进行事件绑定 1.直接在html标签上写入事件类型和事件处理方法. <button onclick = "alert('hello w ...

  9. QT学习(三)

    首先整理一下编码的方法.对于一个待解决的问题,首先应该将大问题分解成小问题,将小问题划分为小小问题... 然后再进行类的抽象,将划分成的问题和类进行对应.然后再对划分的小..问题进行具体的处理分析,划 ...

随机推荐

  1. 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础

    在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...

  2. 力扣(LeetCode)922. 按奇偶排序数组 II

    给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数. 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数:当 A[i] 为偶数时, i 也是偶数. 你可以返回任何满足上述条件的数组 ...

  3. Cordova+Vue快速搭建Hybrid App

    前言 最近项目迭代需要开发一个app,由于项目组其他系统前端技术栈都是Vue,所以自己在需求评估的时候就初步敲定了Cordova+Vue的前端架构,后来查阅了不少资料,也掉了不少坑,这里总结一下,也算 ...

  4. js下数据库 nedb lokijs

    一个7千颗星nedb.一个3千 lokijs  https://rawgit.com/techfort/LokiJS/master/jsdoc/tutorial-Persistence%20Adapt ...

  5. CxImage透明图片合成和文字叠加

    1         CxImage的作用 CxImage将几张图片合成一张图片,在一张底图上添加图片,有些图片是有透明效果的,实现图片之间的透明重叠效果.另外还可以添加文字. (1)背景图片mymix ...

  6. SVN-版本控制工具安装与使用

    什么是版本控制? 版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新. 版本控制透过文档控制(documentation con ...

  7. linux计划任务防暴力破解脚本+免密操作

    1.在root创建satools目录 mkdir satools 2.编辑防破解脚本 vi fpj.sh #!/bin/bash #zsl -xie cat /var/log/secure|awk ' ...

  8. boke练习: @PreAuthorize authentication.name.equals的数据绑定与验证

    boke练习: @PreAuthorize authentication.name.equals的数据绑定与验证 先看2个简单的例子: 一 @PostMapping("/{username} ...

  9. 怎样在winform中上传图片

    http://jingyan.baidu.com/article/b7001fe157d6b60e7382dd7f.html 因为WinForm都是运行在本地的,而我们的网站一般都是布署在服务器上,运 ...

  10. dcoker 安装mysql和数据持久化

    # mysql 镜像下载 docker pull mysql ( 版本自己选择)   # run 服务 docker run --name mysql.5.5 -p 3306:3306 -e MYSQ ...