在Qt中如何使用WebBrowser这个ActiveX控件

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 http://www.qtcn.org/blog/article.php?itemid-565-type-blog.html

 

以前用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文件:


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

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

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

LIBS += -Lyour_libcwebpage_dir -lcwebpage


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

#include "cwebpage.h"

下面是头文件内容:

/*
* 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的时候:

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

显示内容的时候:

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

或者显示字符串:

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

删除这个widget前的时候:

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


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


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

/*
* 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,大功告成了。附件中来副截图。辛辛苦苦搞这个东西,花了三个晚上的时间找资料和试验最终确定方案,辛苦没白费。

Qt 开发浏览器(基于QWebEngineView) Qt实现简易功能的浏览器效果图主要模块(类)Tool(主窗口,负责总的维护)Web(继承自QWebEngineView用于网页的功能的实现)webBrowser(窗口,负责维护Web与一下基本空间功能的实现)LoadWidget(对加载图片进行展示的窗口)主要实现的功能网页显示前进后退开启新选型卡(QTabWidget)动态加载动画 效果图 主要模块(类) Tool(主窗口,负责总的维护) Tool.h文件 class Tool : public QWidget { Q_OBJECT public: 阅读详情

相关推荐

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->setObj

weilp 4040

CWebPage类

VC/MFC中调用javascript函数所需要的类

MFC控件全解析:从标准控件到高级应用与实战技巧

Windows桌面开发领域,GUI编程是构建用户界面的核心。其底层原理基于消息循环、窗口句柄和资源管理机制,这些概念构成了现代UI框架的基础。理解控件的创建、消息映射与数据交换机制,对于开发稳定高效的桌面应用具有重要技术价值,尤其在维护遗留系统、工业软件等场景中至关重要。本文聚焦MFC控件体系,涵盖标准控件如CButton、CEdit,以及高级公共控件如CListCtrl、CTreeCtrl的使用,并深入探讨了子类化、多线程安全等实战技巧,帮助开发者应对实际开发中的常见问题与性能挑战。

weixin_34062469的博客 467

C++调用百度地图案例(VC++)

C++调用百度地图案例(VC++),基于百度地图的二次开发。

Qt编写ActiveX控件实现网页中的运行

Web应用程序中,使用ActiveX控件提供各种功能是很常见的。在Qt中,我们同样可以编写ActiveX控件以提供功能并在Web页面中使用。在创建的过程中,务必勾选“Generate ActiveX Control”选项以生成ActiveX控件。接下来,我们需要在Qt ActiveX控件项目中实现所需的功能。这里以一个简单的例子为例,我们创建一个ActiveX控件,当用户点击它时,在Web页面上弹出一个消息框。为此,我们需要在Qt ActiveX控件中添加按钮,并为按钮添加Clicked事件响应函数。

带你成为别人眼中的大佬! 760

使用QWebEngineView引擎开发基于QtWeb浏览器

本文介绍了如何使用Qt框架中的QWebEngineView引擎设计和开发一个基于QtWeb浏览器。在本文中,我们将探讨如何使用Qt框架中的QWebEngineView引擎设计和开发一个基于QtWeb浏览器。QWebEngineView引擎是Qt WebEngine模块的一部分,它提供了一个功能强大的Web浏览器组件,可以嵌入到Qt应用程序中。然后,我们可以开始创建一个新的Qt应用程序,并添加一个QWebEngineView组件作为我们的Web浏览器。希望这篇文章能够帮助您入门Qt Web浏览器开发。

ByteBuster的博客 524

QT网页浏览器使用QWebEngineView)

Qt的两个API实现网页浏览器

weixin_55887103的博客 672

webbrowser control activex 初接触

 这两天在vs2005的winform程序中用webBrowser控件操纵网页。在窗体上放上浏览器,很酷,简单的一些事件处理之后,发现有些功能实现不来,如webBrowser的Navigate()是个异步操作。如果要使Navigate等待加载网页操作完成,则要去用webBrowser后面的activex控件。原来一直不了解activex,今天在网上查了好久,才大概了解了。原来vs2005里的Web

sclxf的专栏 2213

CallJs

<br /><br />C++ call JavaScript,介绍2种解决方案:1种嵌Webkit作浏览器(纯QT方法);另1种嵌IE控件作为浏览器(适用于非QT,但我是在QT使用的)。<br /> <br /> <br /> <br />    这个需求比较冷门,所以资料少,搞起来比较折腾人。<br /> <br /> <br /> <br />    解放方案1:使用Webkit library (可以说是纯QT实现)<br /> <br /> <br /> <br />    代码量不多,直接贴代

enjolras的专栏 1349

VC++6.0仿360界面POP3邮件监控系统:Win32桌面开发与多线程实战

Windows桌面应用开发领域,理解底层系统机制是构建稳定高效软件的基础。Win32 API和MFC框架作为微软原生技术栈,直接操作消息循环、窗口过程与GDI绘图,是掌握Windows GUI编程核心原理的关键。通过多线程编程,可以实现后台任务与用户界面的高效协同,避免界面卡顿,提升应用响应性。这些技术在现代桌面软件开发中,尤其在需要精细UI定制和高性能要求的场景下,依然具有重要价值。本文以POP3邮件监控系统为例,深入解析了如何使用VC++6.0实现一个功能完整的本地邮件客户端,其中涉及仿360安全卫士

weixin_33721427的博客 398

C++与Flash交互实战:MFC桌面应用集成Flash图表组件

在桌面应用开发中,组件集成与进程间通信是常见的技术需求,尤其是在需要复用既有成熟模块或实现复杂可视化时。其核心原理通常基于操作系统提供的组件对象模型(COM)或类似的进程间通信(IPC)机制,通过定义清晰的接口契约,实现宿主程序与嵌入式运行时之间的双向数据交换与函数调用。这项技术的价值在于能够将不同技术栈开发的模块高效整合,保护历史资产,并满足特定场景下的性能与兼容性要求,常见于工业控制、数据可视化等领域的遗留系统现代化改造。本文聚焦于一个典型应用场景:在基于MFC的C++桌面程序中,通过ActiveX/C

weixin_33834628的博客 347

MFC在2024年的实用价值:从原理到实战的Windows GUI编程指南

Windows GUI编程是桌面应用开发的基础领域,其核心在于理解操作系统提供的原生API与消息驱动机制。MFC(Microsoft Foundation Classes)作为一套经典的C++类库,通过面向对象方式封装了底层的Win32 API,将窗口创建、消息处理、图形绘制等复杂操作抽象为CView、CDocument等类,显著降低了开发原生Windows应用的复杂度。这一技术价值在于它提供了对Windows生态的深度访问能力,尤其适合需要开发轻量、高效、无依赖原生工具的场景。在工业控制、金融、医疗等领域

weixin_30247781的博客 361

从零上手Duilib:Windows C++轻量级UI库入门与实践指南

Windows桌面应用开发领域,C++开发者常面临界面库的选择难题。MFC略显陈旧,Qt虽然功能强大但体积庞大。此时,轻量级、高性能的纯C++本地界面库成为理想的替代方案。其核心原理在于将UI布局与业务逻辑分离,通过XML描述界面结构,C++处理交互逻辑,从而显著提升开发效率和可维护性。这种架构尤其适合对执行体体积和运行时性能有严格要求的客户端应用。Duilib正是这一技术的典型代表,它允许开发者像构建网页一样,用XML快速定义窗口、按钮、列表等控件,并通过高效的渲染引擎实现流畅的界面体验。本文将围绕**

cuanji3287的博客 419

深入掌握MFC框架:Windows桌面开发核心技术与现代集成实战

Windows桌面应用开发的核心在于理解其底层消息机制与图形界面架构。文档/视图模型通过分离数据管理与显示逻辑,实现了数据一致性维护与多视图同步,这是许多桌面框架的设计基础。消息映射机制将系统消息转化为面向对象的事件处理,提升了代码组织性。在工业控制、金融交易等对性能与系统集成度要求高的领域,掌握原生框架能实现更精细的资源控制与更低的延迟。通过集成GDI+、Direct2D等现代图形技术,以及嵌入CEF等Web引擎,传统桌面应用也能获得现代化的视觉效果与交互能力。本文以MFC为例,深入剖析其架构设计、线程安

weixin_33696822的博客 678

VC6 150个案例实战:从MFC到现代Windows开发的技能迁移与底层原理精解

Windows桌面应用开发的核心在于理解操作系统底层机制与图形用户界面框架。从Win32 API到MFC,其原理基于消息驱动与C++对象封装,为构建稳定、高效的本地应用程序提供了基础。掌握这些底层技术价值在于能够深入理解现代GUI框架(如Qt、WPF)的封装逻辑,并具备维护和现代化改造遗留系统的能力。在应用场景上,这涵盖了从工具软件、数据管理程序到嵌入式界面等广泛领域。本文聚焦于通过解析经典的Visual C++ 6.0应用案例,系统拆解MFC框架下的界面编程、文档视图架构、文件系统操作等核心模块,旨在帮助

weixin_34130389的博客 453

QT使用插件QAxWidget来展示web页面

下面就使用QAxWidget来开发一个简单的web browser。该程序只有一个对话框,上面是一个地址框,下面是QAxWidget控件,在地址框中输入地址,单击Enter键,就显示该网址的内容。

码熊之家 7116

Qt使用ActiveX控件

版权声明本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。在Qt使用ActiveX控件Qtwindows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt使用ActiveX控件,并且也开发基于QtActiveX控件ActiveQt包含

我一路走来--- 6万+

Qt for Windows嵌入IE浏览器

<br />//嵌入浏览器 <br />WebBrowser= new QAxWidget(this); <br />WebBrowser->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}")); <br />WebBrowser->setObjectName(QString::fromUtf8("WebBrowser")); <br /><br />//打开网页 <br />WebBrowser->dynamicCa

博客转移到个人主站,请大家移步 http://www.soskp.com/ 1896

Qt 学习之路】Qt5.6作浏览器Demo可查看地图

可以用ui提升部件的方法,设置控件为Microsoft web browser。用到ui里面的QAxWidget控件,用以下这个类来提升这个控件。这里的url可以是网络地址,也可以是实体html。

沙师弟专栏 3489
上一篇: 包含mshtml, SHDocVw, AxSHDocVw的引用
下一篇: Customize Web Browser ActiveX and change its inbuilt settings
sclxf
博客等级 码龄25年 38粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值