阅读 126

QT调用IE浏览器COM插件完成网页浏览

一、可用的嵌入式浏览器方案

QT在5.6之前可以webkit浏览器框架访问网页,在之后就去掉了webkit,加入了QWebEngineView框架,但是QWebEngineView只能支持VS编译器,mingw编译器不支持。 在后面的高版本QT里,mingw编译器如果要加载网页可以使用两种方式。 (1). 编译webkit源码,使用webkit。 也可以不用自己编译,GitHub上可以下载编译好的库,直接下载使用即可。

下载地址: github.com/qtwebkit/qt…

image.png

(2). 使用IE浏览器的COM插件,这个比较简单,也比较方便,就是IE浏览器目前不维护了。

本篇文章就介绍如何使用IE的COM插件完成网页浏览。分别都支持VS和MinGW编译器。

二、实现方法

2.1 加载IE浏览器的COM组件

打开UI设计界面,拖入一个axWidget控件,加载IE浏览器插件(Internet Explorer)。

image.png

image.png

image.png 右键选择转到槽,弹出菜单,可用选择需要使用的信号。

我这里就关联了两个信号,一个标题加载完成,一个是加载进度。

void axWidget_TitleChange(const QString &Text); void axWidget_ProgressChange(int Progress, int ProgressMax); 复制代码

最终实现的效果是,调用百度搜索指定的内容:

image.png

image.png

如果打开网页报错--脚本错误-JS加载错误之类的,需要设置IE浏览器的Intel安全设置,把活动脚本禁用即可。

image.png

(win10)按下win键,弹出左边的选项栏,找到windows附件,打开IE浏览器。 image.png

image.png

image.png

2.2 widget.cpp

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent)     : QWidget(parent)     , ui(new Ui::Widget) {     ui->setupUi(this);     //导出支持调用的函数接口     QString DOC = ui->axWidget->generateDocumentation();     QFile outFile("com_function.html");     outFile.open(QIODevice ::ReadWrite|QIODevice ::Text);     QTextStream TS(&outFile);     TS<<DOC<<endl;     this->setWindowTitle("单词翻译"); } Widget::~Widget() {     delete ui; } /* 工程: COM_InternetExplorer_Test 日期: 2021-10-29 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 加载完成 */ void Widget::on_axWidget_TitleChange(const QString &Text) {     qDebug()<<"Text:"<<Text; } /* 工程: COM_InternetExplorer_Test 日期: 2021-10-29 作者: DS小龙哥 环境: win10 QT5.12.6 MinGW32 功能: 加载进度改变 */ void Widget::on_axWidget_ProgressChange(int Progress, int ProgressMax) {     qDebug()<<QString("%1:%2").arg(ProgressMax).arg(Progress); } void Widget::on_pushButton_clicked() {     QString url;     url="https://www.baidu.com/s?ie=UTF-8&wd="+ui->lineEdit->text();     QVariantList params ={url,0,"","",""};     ui->axWidget->dynamicCall("Navigate2(QString, QVariant&, QVariant&, QVariant&, QVariant&)", params); } 复制代码

2.3 widget.h

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QAxWidget> #include <QDebug> #include <QFile> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget {     Q_OBJECT public:     Widget(QWidget *parent = nullptr);     ~Widget(); private slots:     void on_axWidget_TitleChange(const QString &Text);     void on_axWidget_ProgressChange(int Progress, int ProgressMax);     void on_pushButton_clicked(); private:     Ui::Widget *ui; }; #endif // WIDGET_H 复制代码

2.4 xxx.pro文件

QT       += core gui QT       += axcontainer greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \     main.cpp \     widget.cpp HEADERS += \     widget.h FORMS += \     widget.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target 复制代码

文章分类
作者:DS小龙哥
链接:https://juejin.cn/post/7024845104481304583


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐