QT实现浏览器访问网页,使用QWebEngineView,支持播放mp4
参考:https://blog.youkuaiyun.com/weixin_40355471/article/details/120698537
增加了调试和播放mp4的功能,屏幕放大和缩小;
使用QT creator msvc2019
在por文件添加QT += webenginewidgets
QNetworkProxyFactory::setUseSystemConfiguration(false);//关闭系统代理,解决速度加载网页速度慢的问题 采用release会更快
qputenv(“QTWEBENGINE_REMOTE_DEBUGGING”,“8888”);
监听8888端口
新建一个类继承QWebEngineView, qWebEngine.h文件
#ifndef QWEBENGINE_H
#define QWEBENGINE_H
#include <QWidget>
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QUrl>
#include <QMouseEvent>
#include <QApplication>
#include <QWebEngineSettings>
#include <QWebEngineFullScreenRequest>
class qWebEngine : public QWebEngineView
{
Q_OBJECT
public:
explicit qWebEngine(QWidget *parent = nullptr);
~qWebEngine();
protected:
QWebEngineView* createWindow(QWebEnginePage::WebWindowType type);
private slots:
void on_linkHovered(const QString& url);
signals:
private:
QUrl m_url;
};
#endif // QWEBENGINE_H
qWebEngine.cpp文件
#include "qWebEngine.h"
qWebEngine::qWebEngine(QWidget *parent)
: QWebEngineView{parent}
{
this->setAttribute(Qt::WA_DeleteOnClose);
connect(this->page(),&QWebEnginePage::linkHovered,this,&qWebEngine::on_linkHovered);
//这里实现屏幕最大化和最小化
this->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled,true);
connect(this->page(),&QWebEnginePage::fullScreenRequested,this,[=](QWebEngineFullScreenRequest pageRequeset)
{
pageRequeset.accept();
});
}
qWebEngine::~qWebEngine()
{
}
QWebEngineView *qWebEngine::createWindow(QWebEnginePage::WebWindowType type)
{
//加载连接地址
if(!m_url.isEmpty())
{
this->load(m_url);
emit QEvent::ChildPolished; //重新加载页面时,手动触发一个ChildPolished事件
}
return nullptr;
}
void qWebEngine::on_linkHovered(const QString &url)
{
//获取视图里点击的链接地址
m_url.setUrl(url);
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWebEngineView>
#include <QNetworkProxyFactory>
#include "qWebEngine.h"
#include "Inspector.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_back_clicked();
void on_pushButton_forWard_clicked();
void on_pushButton_Go_clicked();
void on_pushButton_refresh_clicked();
private:
Ui::MainWindow *ui;
qWebEngine *m_webEngine;
Inspector *m_inspector;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QNetworkProxyFactory::setUseSystemConfiguration(false);//关闭系统代理,解决速度加载网页速度慢的问题 采用release会更快
//this->setWindowTitle("浏览器"); //这个会报错,未解决
m_inspector= nullptr;
m_webEngine = new qWebEngine(this);
ui->verticalLayout_2->addWidget(m_webEngine);
connect(ui->actioninspector,&QAction::triggered,this,[=]()
{
if(m_inspector == nullptr)
{
m_inspector = new Inspector(this);
}
else
{
m_inspector->show();
}
});
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_back_clicked()
{
m_webEngine->back();
}
void MainWindow::on_pushButton_forWard_clicked()
{
m_webEngine->forward();
}
void MainWindow::on_pushButton_Go_clicked()
{
QString url = ui->lineEdit->text();
if(!url.isEmpty())
{
m_webEngine->load(url);
}
}
void MainWindow::on_pushButton_refresh_clicked()
{
m_webEngine->reload();
}
新建一个对话框显示调试窗口 Inspector.h
#ifndef INSPECTOR_H
#define INSPECTOR_H
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "qWebEngine.h"
namespace Ui {
class Inspector;
}
class Inspector : public QDialog
{
Q_OBJECT
public:
explicit Inspector(QWidget *parent = nullptr);
~Inspector();
void show();
private:
Ui::Inspector *ui;
qWebEngine *m_webView;
};
#endif // INSPECTOR_H
Inspector.cpp
#include "Inspector.h"
#include "ui_Inspector.h"
Inspector::Inspector(QWidget *parent) :
QDialog(parent),
ui(new Ui::Inspector)
{
ui->setupUi(this);
connect(ui->pushButton_close,&QPushButton::clicked,this,[=](){
hide();
});
m_webView = new qWebEngine(this);
ui->verticalLayout->addWidget(m_webView);
m_webView->load(QUrl("http://localhost:8888"));
//m_webView->page()->setDevToolsPage();
QDialog::show();
qDebug()<<"111";
}
Inspector::~Inspector()
{
delete ui;
}
void Inspector::show()
{
m_webView->reload();
QDialog::show();
}
这一句放在main.cpp初始化窗口前
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qputenv("QTWEBENGINE_REMOTE_DEBUGGING","8888");
MainWindow w;
w.show();
return a.exec();
}
qputenv(“QTWEBENGINE_REMOTE_DEBUGGING”,“8888”);
调试信息在8888端口,也可通过浏览器去监听
浏览器显示如图:
程序显示如图
效果图
qt自带的webengine不支持播放MP4需要手动编译,并且替换掉之前的文件
我这里的是5.15.2 msvc2019
替换路径:找到你安装qt的路径,我这里是
Qtwebengineview不支持mingw,所以只选择msvc,选择msvc2019至于是32位还是34位,看个人需求,我这里是32位
进入到bin文件,将编译好的文件放进来,替换掉之前的文件
这个是解压后进入到bin目录,我直接都把这几个文件都复制到msvc里,没区分具体是哪个
地址:源码和编译好的文件
防止出错选择这几个文件去替换
Qt5WebChannel.dll
Qt5WebChanneld.dll
Qt5WebChanneld.pdb
Qt5WebEngine.dll
Qt5WebEngineCore.dll
Qt5WebEngineCored.dll
Qt5WebEngineCored.pdb
Qt5WebEngined.dll
Qt5WebEngined.pdb
Qt5WebEngineWidgets.dll
Qt5WebEngineWidgetsd.dll
Qt5WebEngineWidgetsd.pdb
https://download.youkuaiyun.com/download/qq_42919993/85194568