QT5 通过 webview2 加载网页

2023-10-30 19:29
文章标签 网页 加载 qt5 webview2

本文主要是介绍QT5 通过 webview2 加载网页,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官方文档参考:https://learn.microsoft.com/zh-cn/microsoft-edge/webview2/get-started/win32

Webview2依赖的头文件和库

头文件主要为:WebView2和WixLibrary,存储在include/external
[图片]
[图片]

库主要为:WebView2LoaderStatic.lib和WebView2Loader.dll,存储在lib/external
[图片]

初始化项目加载webview2

CMakeLists文件

#工程名
project(uXXXXSoftware)#cmake最低版本
cmake_minimum_required(VERSION 3.17)#设定cmake模块的路径
set(CMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake # 项目cmake${PROJECT_SOURCE_DIR}/cmake/base # 通用cmake${CMAKE_MODULE_PATH})#加载配置项
include(set_env)#加载项目配置
include(init_project)#加载编译配置
include(set_compile_arg)

base/set_env.cmake

message(STATUS "====================set_env.cmake===================")# 处理编译字符集问题
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")#C++标准
set(CMAKE_CXX_STANDARD 11)# 开启QT用于预处理的组件
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)#设置全局系统变量
set(PROJECT_EXTERNAL_DIR "D:/MyCPP")
set(PROJECT_EXTERNAL_INCLUDE_DIR "${PROJECT_EXTERNAL_DIR}/include/external")
set(PROJECT_EXTERNAL_LIB_DIR "${PROJECT_EXTERNAL_DIR}/lib/external")
message(STATUS "PROJECT_EXTERNAL_INCLUDE_DIR is ${PROJECT_EXTERNAL_INCLUDE_DIR}")
message(STATUS "PROJECT_EXTERNAL_LIB_DIR is ${PROJECT_EXTERNAL_LIB_DIR}")#配置QT位置
message(STATUS "CMAKE_SYSTEM_NAME is ${CMAKE_SYSTEM_NAME}")
if (CMAKE_SYSTEM_NAME MATCHES "Windows")#下面是Windows下Qt的默认前缀set(CMAKE_PREFIX_PATH "D:/Library/Qt5.14.2/5.14.2/msvc2017_64/lib/cmake")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_NAME MATCHES "Linux")#下面是aarch64 Linux下Qt的默认前缀set(CMAKE_PREFIX_PATH /opt/Qt5.14.2_aarch64/)
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")#下面是Linux x64下Qt的默认前缀set(CMAKE_PREFIX_PATH /opt/Qt5.14.2/5.14.2/gcc_64)
endif ()
message(STATUS "CMAKE_PREFIX_PATH is ${CMAKE_PREFIX_PATH}")message(STATUS "====================set_env.cmake end===================")

init_project.cmake

message(STATUS "====================init_project.cmake===================")# 查找QT的模块
find_package(Qt5 COMPONENTSCoreGuiWidgetsREQUIRED)#外部头文件的路径
include_directories(SYSTEM${PROJECT_EXTERNAL_INCLUDE_DIR}
)
#外部库文件的路径
link_directories(${PROJECT_EXTERNAL_LIB_DIR})# 把目录Packages/MainFrame/src下面的所有文件作为变量存储
aux_source_directory(Packages/MainFrame/src SOURCES)
# 添加源文件
add_executable(uXXXXSoftware ${SOURCES})# 添加模块
target_link_libraries(uXXXXSoftware Qt5::CoreQt5::GuiQt5::WidgetsWebView2LoaderStatic
)message(STATUS "====================init_project.cmake end===================")

base/set_compile_arg.cmake

message(STATUS "====================set_compile_arg.cmake===================")# 默认的编译配置(可选)
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)set(DEBUG_SUFFIX)if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")set(DEBUG_SUFFIX "d")endif ()set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")if (NOT EXISTS "${QT_INSTALL_PATH}/bin")set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")if (NOT EXISTS "${QT_INSTALL_PATH}/bin")set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")endif ()endif ()if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E make_directory"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy"${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll""$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")endif ()foreach (QT_LIB Core Gui Widgets)add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy"${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll""$<TARGET_FILE_DIR:${PROJECT_NAME}>")endforeach (QT_LIB)
endif ()message(STATUS "====================set_compile_arg.cmake end===================")

main函数

#pragma execution_character_set("utf-8")#include <QApplication>
#include <QFont>
#include "main_windows.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);//设置字体QFont font;font.setFamily("Microsoft Yahei UI");font.setPixelSize(13);a.setFont(font);MainWindow mainWindow;mainWindow.show();return QApplication::exec();
}

MainWindow函数

#include "main_windows.h"
#include "main_windows_layout.h"
#include "web_display_widget.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {this->setWindowTitle("XXXX");this->resize(1024, 960);QWidget* centralWidget = new QWidget(this);auto webview2Widget = new WebDisplayWidget(centralWidget);webview2Widget->resize(1024, 960);this->setCentralWidget(centralWidget);
}

WebDisplayWidget,显示web的widget核心函数
web_display_widge.h

#pragma execution_character_set("utf-8")#include <wrl.h>
#include <QWidget>
#include "WixLibrary/wil/com.h"
#include "WebView2/WebView2.h"class WebDisplayWidget : public QWidget {
public:WebDisplayWidget(QWidget *parent = nullptr);~WebDisplayWidget() override;public:HRESULT OnEnvironmentCompleted(HRESULT result, ICoreWebView2Environment *env);HRESULT OnControllerCompleted(HRESULT result, ICoreWebView2Controller *controller);HRESULT OnNavigationStarting(ICoreWebView2 *sender, ICoreWebView2NavigationStartingEventArgs *args);HRESULT OnNavigationCompleted(ICoreWebView2 *sender, ICoreWebView2NavigationCompletedEventArgs *args);HRESULT OnWebResourceRequested(ICoreWebView2 *sender, ICoreWebView2WebResourceRequestedEventArgs *args);private:void InitWebView2();private:wil::com_ptr<ICoreWebView2Controller> m_webViewController;wil::com_ptr<ICoreWebView2> m_webView;EventRegistrationToken m_navigationStartingToken;EventRegistrationToken m_navigationCompletedToken;EventRegistrationToken m_webResourceRequestedToken;
};

web_display_widget.cpp

#include "web_display_widget.h"WebDisplayWidget::WebDisplayWidget(QWidget *parent) : QWidget(parent) {InitWebView2();
}WebDisplayWidget::~WebDisplayWidget() {}void WebDisplayWidget::InitWebView2() {CreateCoreWebView2EnvironmentWithOptions(nullptr, nullptr, nullptr,Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>([this](HRESULT result, ICoreWebView2Environment *env) -> HRESULT {return OnEnvironmentCompleted(result, env);}).Get());
}HRESULT WebDisplayWidget::OnEnvironmentCompleted(HRESULT result, ICoreWebView2Environment *env) {env->CreateCoreWebView2Controller(reinterpret_cast<HWND>(this->winId()),Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>([this](HRESULT result, ICoreWebView2Controller *controller) -> HRESULT {return OnControllerCompleted(result, controller);}).Get());return S_OK;
}HRESULT WebDisplayWidget::OnControllerCompleted(HRESULT result, ICoreWebView2Controller *controller) {if (controller == nullptr) {return S_FALSE;}//初始化webview2的依赖对象m_webViewController = controller;m_webViewController->get_CoreWebView2(&m_webView);//定义窗口RECT rect = {0, 0, this->width(), this->height()};m_webViewController->put_Bounds(rect);//导航地址m_webView->Navigate(L"https://www.baidu.com");//开始m_webView->add_NavigationStarting(Microsoft::WRL::Callback<ICoreWebView2NavigationStartingEventHandler>([this](ICoreWebView2 *webview, ICoreWebView2NavigationStartingEventArgs *args) -> HRESULT {return OnNavigationStarting(webview, args);}).Get(), &m_navigationStartingToken);//完成m_webView->add_NavigationCompleted(Microsoft::WRL::Callback<ICoreWebView2NavigationCompletedEventHandler>([this](ICoreWebView2 *webview, ICoreWebView2NavigationCompletedEventArgs *args) -> HRESULT {return OnNavigationCompleted(webview, args);}).Get(), &m_navigationCompletedToken);m_webView->add_WebResourceRequested(Microsoft::WRL::Callback<ICoreWebView2WebResourceRequestedEventHandler>([this](ICoreWebView2 *webview, ICoreWebView2WebResourceRequestedEventArgs *args) -> HRESULT {return OnWebResourceRequested(webview, args);}).Get(), &m_webResourceRequestedToken);return 0;
}HRESULT WebDisplayWidget::OnNavigationStarting(ICoreWebView2 *sender, ICoreWebView2NavigationStartingEventArgs *args) {return S_OK;
}HRESULT
WebDisplayWidget::OnNavigationCompleted(ICoreWebView2 *sender, ICoreWebView2NavigationCompletedEventArgs *args) {return S_OK;
}HRESULT
WebDisplayWidget::OnWebResourceRequested(ICoreWebView2 *sender, ICoreWebView2WebResourceRequestedEventArgs *args) {return S_OK;
}

这篇关于QT5 通过 webview2 加载网页的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310071

相关文章

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模