• 22474阅读
  • 4回复

QT 中嵌入 IE浏览器 [复制链接]

上一主题 下一主题
离线artern
 

只看楼主 倒序阅读 楼主  发表于: 2009-04-18
QT 中如何嵌入 IE浏览器

要在QT嵌入的IE浏览器中执行一些有javascript的交互界面
离线seesea
只看该作者 1楼 发表于: 2009-04-18
【转来的,转自哪里忘记了,网上可以搜到原文章,我试过了,可以实现,具体怎么控制不清楚】

以前用BCB和C#的时候,都曾用到过WebBrowser这个ActiveX控件,在BCB里称为CppWebBrowser,使用它来嵌入到程序中,很不错的功能。

现在用Qt,想在程序中嵌入一个网页浏览器,有哪些方法呢?

Qt自带了一个QTextBrowser,但是它只能显示简单的网页,复杂的就不行了。
对于嵌入式的浏览器引擎,现在用得比较多的是分别基于IE, Firefox(Gecko), Opera, Konqueror(khtml)这四个引擎的,但现在使用最多的恐怕就属前两者了。

基于IE内核引擎的浏览器很多,比如Maxton, 腾迅TT等。
基于Gecko的也比较多,主要是Linux下的比较多,比如Galen, Epiphany

当 然,现在市面上还是基于IE资料比较多。但Gecko现在发展迅猛,并且源码公开,在Windows下的,它有各种嵌入组件,比如mfcEmbed, winEmbed, ActiveX Control等,在Linux下,有GtkMozEmbed等。那要写跨平台的Qt程序,使用浏览器嵌入组件该怎么选择呢?
花了一整天的时间来查找Embed Gecko方面的资料和试验,发现除了Linux下GtkMozEmbed发展比较好,windows下则比较少,并且windows下要想编译Gecko,最好是使用VC来编译,这就费劲了。

现在方案出来了,可在Windows下使用WebBrowser ActiveX控件, 在Linux下使用GtkMozEmbed模块。
GtkMozEmbed 就不用说了,包装得比较方便使用,在Qt中用它的和,解决了Qt和Gtk如何混合编程就可以了。在Windows下要使用WebBrowser这个 ActiveX控件,则比较麻烦,因为只有商业版的Qt中才提供ActiveQt模块以支持ActiveX/COM等的开发。

于是继续找资料,找到了一个国外的用C语言写的一个使用WebBrowser的包装,很是不错,可以到下面的网址去看资料:
http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4379/

从下面的网址把他的程序源码下载下来:
http://www.codeguru.com/code/legacy/ieprogram/cwebpage.zip
解压后里面有下面我们需要的文件(原作者是用VC编译的)
cwebpage.dll     动态库,可直接拿来用
cwebpage.h     头文件
dll.def           库导出文件,我们要使用这个生成mingw编译需要的.a文件

第一步,生成.a文件:
Quote:

dlltool -k -d dll.def -l libcwebpage.a

现在我们得到了Qt程序要使用的三个文件:cwebpage.dll, cwebpage.h, libcwebpage.a

接着,修改Qt程序,在.pro工程文件中加上链接库:
Quote:

LIBS += -Lyour_libcwebpage_dir -lcwebpage


接着,在Qt程序中加入头文件:
Quote:

#include "cwebpage.h"

下面是头文件内容:
Quote:

/*
* This include file is meant to be included with any C source you
* write which uses the cwebpage DLL.
*/

#ifndef __CWEBPAGE_H_INCLUDED
#define __CWEBPAGE_H_INCLUDED

#include <windows.h>

#ifdef __cplusplus
{
#endif

long WINAPI EmbedBrowserObject(HWND);
#define EMBEDBROWSEROBJECT EmbedBrowserObject
typedef long WINAPI EmbedBrowserObjectPtr(HWND);

void WINAPI UnEmbedBrowserObject(HWND);
#define UNEMBEDBROWSEROBJECT UnEmbedBrowserObject
typedef long WINAPI UnEmbedBrowserObjectPtr(HWND);

long WINAPI DisplayHTMLPage(HWND, LPCTSTR);
#define DISPLAYHTMLPAGE DisplayHTMLPage
typedef long WINAPI DisplayHTMLPagePtr(HWND, LPCTSTR);

long WINAPI DisplayHTMLStr(HWND, LPCTSTR);
#define DISPLAYHTMLSTR DisplayHTMLStr
typedef long WINAPI DisplayHTMLStrPtr(HWND, LPCTSTR);

#ifdef __cplusplus
}
#endif
#endif /* __CWEBPAGE_H_INCLUDED */


我们看到,这个头文件中声明了四个函数:
long WINAPI EmbedBrowserObject(HWND);
void WINAPI UnEmbedBrowserObject(HWND);
long WINAPI DisplayHTMLPage(HWND, LPCTSTR);
long WINAPI DisplayHTMLStr(HWND, LPCTSTR);
参考作者提供的源代码里的程序,可知,EmbedBrowserObject用于初始化,UnEmbedBrowserObject用于卸载,DisplayHTMLPage和DisplayHTMLStr分别用于显示网址和字符串内容。

有了这些,在Qt程序中就好用了:
新建一个widget的时候:
Quote:

QWidget *widget = new QWidget(this);
EmbedBrowserObject(widget->winId());

显示内容的时候:
Quote:

DisplayHTMLPage(widget->winId(), (TCHAR *)(QString("http://www.qtcn.org").toStdString().c_str()));

或者显示字符串:
Quote:

DisplayHTMLStr(widget->winId(), (TCHAR *)(QString("<h1>你好世界</h1>").toStdString().c_str()));

删除这个widget前的时候:
Quote:

UnEmbedBrowserObject(widget->winId());
delete widget;


为了方便使用,用户可从QWidget继承一个类,把这四个函数的操作封装进去。


下面就可以开始编译了,但是,链接时会出现错误,主要问题在于库的不同而不能正确识别符号:
只要把头文件的声明头改下就可以为mingw所用了(当然以前那个VC可直接使用的)
Quote:

/*
* This include file is meant to be included with any C source you
* write which uses the cwebpage DLL.
*/

#ifndef __CWEBPAGE_H_INCLUDED
#define __CWEBPAGE_H_INCLUDED

#include <windows.h>
#define DLLIMPORT __declspec (dllimport)

#ifdef __cplusplus
extern "C" {
#endif

long DLLIMPORT EmbedBrowserObject(HWND);
#define EMBEDBROWSEROBJECT EmbedBrowserObject
typedef long DLLIMPORT EmbedBrowserObjectPtr(HWND);

void DLLIMPORT UnEmbedBrowserObject(HWND);
#define UNEMBEDBROWSEROBJECT UnEmbedBrowserObject
typedef long DLLIMPORT UnEmbedBrowserObjectPtr(HWND);

long DLLIMPORT DisplayHTMLPage(HWND, LPCTSTR);
#define DISPLAYHTMLPAGE DisplayHTMLPage
typedef long DLLIMPORT DisplayHTMLPagePtr(HWND, LPCTSTR);

long DLLIMPORT DisplayHTMLStr(HWND, LPCTSTR);
#define DISPLAYHTMLSTR DisplayHTMLStr
typedef long DLLIMPORT DisplayHTMLStrPtr(HWND, LPCTSTR);

#ifdef __cplusplus
}
#endif
#endif /* __CWEBPAGE_H_INCLUDED */


关于为什么要这样改,各位可查找一下不同开发工具所做的DLL库之间的不同方面的资料。

OK,大功告成了。附件中来副截图。辛辛苦苦搞这个东西,花了三个晚上的时间找资料和试验最终确定方案,辛苦没白费。
离线wvins
只看该作者 2楼 发表于: 2009-04-18
好多啊...

你想嵌入IE还是浏览器?
两个概念,如果是要浏览器能够执行JavaScript,Qt4用QWebView就可以。
不过这玩意比IE灵活,换种说法,就是控制麻烦些。很多东西要自己实现。

可以参考Qt自带的Browser的例子
离线nokymali
只看该作者 3楼 发表于: 2009-04-18
可以使用QAxWidget内嵌IE,QAxwidget专门用于com、Axtive控件,Help里有例子
离线artern

只看该作者 4楼 发表于: 2009-04-20
谢谢各位高手的支持
快速回复
限100 字节
 
上一个 下一个