1. 程式人生 > >Qt呼叫Windows Webbrowser控制元件,呼叫JS方法

Qt呼叫Windows Webbrowser控制元件,呼叫JS方法

說明:

Qt版本為4.7.4   

編譯工具為VS2008

一.需要包含的標頭檔案

#include"ExDisp.h"

#include"comutil.h"

#include"atlcomcli.h"

#include "Mshtml.h"

庫檔名: comsuppw.lib  comsupp.lib

二.程式碼呼叫

ui.axWidget->setObjectName(QString::fromLocal8Bit("WebBrowser"));

         ui.axWidget->setFocusPolicy(Qt::StrongFocus);

         ui.axWidget->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}"))

ui.axWidget->setContentsMargins(0,0, 0, 0);

ui.axWidget->setProperty("DisplayScrollBars",

true);

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

//這個是禁止報JS錯誤的

         if(webBrowser)

         {

                   VARIANT_BOOLbValue = true; 

        webBrowser->put_Silent(bValue); 

         webBrowser->Release(); 

}

//開啟要載入的網頁

QString_url("http://192.168.1.69:8080/FFplayer.html");

         _variant_tstrVar(_url.toLocal8Bit().data());

         BSTRbstrText = strVar.bstrVal;

         webBrowser->Navigate(bstrText,NULL, NULL, NULL, NULL);

//呼叫JS方法程式碼片段

CComQIPtr<IHTMLDocument2>_spDoc;

         webBrowser->get_Document((IDispatch**)(&_spDoc));

         if(_spDoc== NULL)

                   return;

         CComDispatchDriver_spScript; 

         _spDoc->get_Script(&_spScript);

         CComVariant_var1(_playurl.toLocal8Bit().data()), _varRet;

_spScript.Invoke1(L"svLivePlay",&_var1, &_varRet);

三.需要注意的問題

1.需要使用MFC庫,最好是靜態載入;

2.修改main的入口函式,防止報MFC的錯誤,如下所示:

int APIENTRY _tWinMain(HINSTANCE hInstance,

                     HINSTANCEhPrevInstance,

                     LPTSTR    lpCmdLine,

                     int       nCmdShow)

{

//應用MFC庫,防止(在靜態庫中使用MFC) 靜態編譯無法通過

                            int nRetCode= 0;

                            if (!AfxWinInit(::GetModuleHandle(NULL),NULL, ::GetCommandLine(),0))

                            {

                                      // TODO: 更改錯誤程式碼以符合您的需要

                                      _tprintf(_T("錯誤: MFC 初始化失敗\n"));

                                      nRetCode = 1;

                            }

                            else

                            {

                                      // TODO: 在此處為應用程式的行為編寫程式碼。

}

//建立物件需要的引數為__argc,__argv

QtSingleApplication a(__argc, __argv);

                            if(a.isRunning())

                            {

                                      return -1;

}

//……

}

3.需要包含stdafx.h,  targetver.h標頭檔案;

4.如果提示庫衝突錯誤,在命令列裡輸入“/FORCE:MULTIPLE”編譯命令;