• 4668阅读
  • 5回复

用了QAxContainer,怎么获取网页里面的信息,并填充数据? [复制链接]

上一主题 下一主题
离线seahouse
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-18
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-03-18) —
各位大牛,请教一下:
    我用Qt里的例子(\examples\activeqt\webbrowser)打开了IE,我想在打开的页面里的某些输入框中自动填充数据,请问如何实现呢?


如下图,是用Qt打开IE的情况:






我想在百度搜索里的输入框中自动填充(用代码写入)数据,请问该怎么实现呢?
离线XChinux

只看该作者 1楼 发表于: 2013-03-18
去搜索WebBrowser,搜索VB和Delphi、 C#方面的资料,会给你启示的。
还有,使用generateDocumentation()方法来生成HTML文档来查看。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xsjqqq123

只看该作者 2楼 发表于: 2013-03-19
使用QT的webkit吧
这个功能强大,填空的话更是小菜一碟……

非要调用WEB控件,用这个调用它的功能
QVariant  dynamicCall ( const char * function, const QVariant & var1 = QVariant(), const QVariant & var2 = QVariant(), const QVariant & var3 = QVariant(), const QVariant & var4 = QVariant(), const QVariant & var5 = QVariant(), const QVariant & var6 = QVariant(), const QVariant & var7 = QVariant(), const QVariant & var8 = QVariant() )
离线seahouse

只看该作者 3楼 发表于: 2013-03-19
感谢楼上两位牛哥,我说下后续:
之所以要用QAxContainer,是因为我需要用IE的内核,而不能用QWebkit,因为我发现QWebkit和webkit有一点区别,可能是网络通信时有所不同(没有仔细研究过)。

经过查资料,我有所进展,但问题还没彻底解决。以下是我写的填充数据段函数:
  1. void MainWindow::fillInput()
  2. {
  3. //    WebBrowser->dynamicCall("nick", "1111");
  4. //    WebBrowser->setProperty("nick", "1111");
  5.     IWebBrowser2 *web = 0;  //{8856F961-340A-11D0-A96B-00C04FD705A2}
  6.     IHTMLDocument2 *html = 0;
  7.     IDispatch *script = 0;  //
  8.     QString t1 = WebBrowser->control();
  9.     long l1 = WebBrowser->queryInterface(QUuid("{8856F961-340A-11D0-A96B-00C04FD705A2}"), (void **)&web);
  10.     if (web)
  11.     {
  12.         web->get_Document((IDispatch **)&html);
  13.         if (html)
  14.         {
  15.             html->get_Script(&script);
  16.             if (script)
  17.             {
  18.                 DISPID dispid;
  19.                 HRESULT hr;
  20. //                LPOLESTR szMember = L "color";
  21.                 OLECHAR *szMember = L"document.getElementById(\"nick\").value=\"1111\";";
  22.                 hr = script->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
  23.                 if (SUCCEEDED(hr))
  24.                 {
  25.                     DISPPARAMS dispparams;
  26.                     memset(&dispparams, 0, sizeof(DISPPARAMS));
  27.                     dispparams.cArgs = 0;
  28.                     dispparams.cNamedArgs = 0;
  29.                     VARIANT vaResult;
  30.                     EXCEPINFO excepInfo;
  31.                     memset(&excepInfo, 0, sizeof(EXCEPINFO));
  32.                     UINT nArgErr = (UINT)-1;
  33.                     hr = script->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);
  34.                 }
  35.             }
  36.         }
  37.         web->Release();
  38.     }
  39. }


出现问题如下:
1  第9行返回的web是0,也就是空,函数返回值l1是一个负数。我已检查过UUID,与之前设置的UUID是一样的。
2  最后调用脚本的szMember变量应该是脚本函数名还是脚本内容?如果是函数名,那么脚本应该如何载入到合适的地方?
由于还没研究明白,望大牛们不吝赐教~~~  




离线XChinux

只看该作者 4楼 发表于: 2013-03-19
楼主研究得也差不多,其它的就爱莫能助了,参考资料方面,还是得借助VB、Delphi、C#方面的资料了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线seahouse

只看该作者 5楼 发表于: 2013-03-21
问题已解决。
通过querySubObject函数得到QAxObject *类型的对象,再用dynamicCall函数执行js脚本进行填充。

现在进入项目的下一个疑难杂症了。
感谢两位大哥的解答。
快速回复
限100 字节
 
上一个 下一个