一、可用的嵌入式浏览器方案
QT在5.6之前可以webkit浏览器框架访问网页,在之后就去掉了webkit,加入了QWebEngineView框架,但是QWebEngineView只能支持VS编译器,mingw编译器不支持。
在后面的高版本QT里,mingw编译器如果要加载网页可以使用两种方式。
(1). 编译webkit源码,使用webkit。 也可以不用自己编译,GitHub上可以下载编译好的库,直接下载使用即可。
下载地址: https://github.com/qtwebkit/qtwebkit/releases/tag/qtwebkit-5.212.0-alpha4
(2). 使用IE浏览器的COM插件,这个比较简单,也比较方便,就是IE浏览器目前不维护了。
本篇文章就介绍如何使用IE的COM插件完成网页浏览。分别都支持VS和MinGW编译器。
二、实现方法
2.1 加载IE浏览器的COM组件
打开UI设计界面,拖入一个axWidget控件,加载IE浏览器插件(Internet Explorer)。
右键选择转到槽,弹出菜单,可用选择需要使用的信号。
我这里就关联了两个信号,一个标题加载完成,一个是加载进度。
void axWidget_TitleChange(const QString &Text); void axWidget_ProgressChange(int Progress, int ProgressMax);
最终实现的效果是,调用百度搜索指定的内容:
如果打开网页报错–脚本错误-JS加载错误之类的,需要设置IE浏览器的Intel安全设置,把活动脚本禁用即可。
(win10)按下win键,弹出左边的选项栏,找到windows附件,打开IE浏览器。
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