Qt内嵌IE实现与JavaScript交互

工作需要同时内嵌Chrome、IE,相较于IE,CEF开源简单多了,调用IE费了点功夫研究。

重点记述  在 qt 中,实现 js 与  客户端之前互动相互调用,代码资料根据网站整理并测试

内嵌调用IE 需要引入 QT += axcontainer (具体调用 IE 略过)

1、qt 调用 js,该调用方法比较简单

QAxObject *document = ui->axWidget->querySubObject("Document");
if(!document)
    return ;
QAxObject *parentWindow = document->querySubObject("parentWindow");
{
    QAxObject obj(&m_call, this);
    parentWindow->dynamicCall("SaveCppObject (QAxObject*)", obj.asVariant());// 见 qt 帮助文档, 详细介绍了支持的类型
}

2、js 调用 qt,目前整理并测试的有三种方式

  • 先通过 qt 调用 js 方法,将 IDispatch 指针对象,传入 js 中,js保存并可以在后续引用(问题:当页面刷新,需要在刷新方法内再次 传入 IDispatch 指针对象)
  • js 主动调用 qt,通过 window.external.GetProcessID() 方式调用
  • 写 activeX ,js 中 通过对象调用(经测试后发现,稍微复杂,需要实现注册该activeX,或者 qt 主动调用该activeX)

    2.1 qt 调用 js 方法,以实现调用 qt

    2.1.1 qt 部分写法

    • 继承 IDispatch,主要是为了实现其内QueryInterface、GetIDsOfNames、Invoke三个方法
    • 调用(1),实现将 该指针传递给 js

    2.1.2 js 部分写法

    var cpp_obj = null;
    // 该方法右 qt 主动调用
    function SaveCppObject(val) {
        cpp_obj = val;
        alert(val);
        val.ShowMessageBox("你好,我是Javascript,你是谁?");
    }
    function test_method2() {
        if (cpp_obj && typeof(cpp_obj) != "undefined") {
            var processId = cpp_obj.GetProcessID();
            alert(processId);
        }
        else {
            alert("cpp_obj对象不存在,需要qt先调用注册IDispatch才可以");
        }
    }

    2.2 js 主动调用 qt,通过 window.external.xx 方式调用

    2.2.1 qt 部分写法

    • 继承 IDispatch,主要是为了实现其内QueryInterface、GetIDsOfNames、Invoke三个方法
    • 继承IDocHostUIHandler,主要是为了实现 GetExternal 方法(目的:通过继承该js,可以捕获 js 调用 qt)
    • 继承public QAxAggregated,public IObjectSafety 网上说法是绕过安全认证

    2.2.2 js 部分写法

    function test_method1() {
        try {
            alert(window.external.GetProcessID());
        }
        catch (e) {
            alert(e.message);
        }
    }

    示例代码:https://download.csdn.net/download/beyond0851/10872345

    参考文档:

    QAxWidget 调用ocx控件之 js双向通信

    https://blog.csdn.net/tianweibooo/article/details/81003188

    继承CAxHostWindow, IDocHostUIHandler 控制浏览器界面

    https://www.xuebuyuan.com/1285504.html

    CEF3开发者系列之外篇——IE中JS与C++交互

    https://www.cnblogs.com/guolixiucai/p/4957521.html

    浏览器编程之二IE控件与JS交互篇

    https://blog.csdn.net/river_mumu/article/details/8692666

    (******) VC与JavaScript交互(三) ———— JS调用C++

    https://blog.csdn.net/charlessimonyi/article/details/50984903

    你可能感兴趣的:(Qt)