qt集成cef QWidget

2023-11-18

编译libcef_dll_wrapper

假设你已经编译出了libcef_dll_wrapper.lib(Debug和Release版本,并且对应版本的程序集类型分别是:MDd和MD):qt的运行时库是MDd类型的,因此cef3编译的时候也应该遵循这个运行时库的编译方方式;qt集成cef在windows和mac下编译_LIJIWEI0611的博客-CSDN博客_cef mac

本人编译的时32位release版本

新建一个cef_bin的文件夹:拷贝cef87(本人使用的cef版本):的include Resources Release文件夹到新建的cef_bin文件夹中

 

 

 同时将编译生成的Release 版本的libcef_dll_wrapper.lib拷贝到cef_bin/release目录:

将编译生成的Release 版本的libcef_dll_wrapper.lib的路径在:ef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_windows32\build\libcef_dll_wrapper\Release\libcef_dll_wrapper.lib

 

这样cef_bin就准备好了:

QWidget中集成cef

1 首先qt_creator新建一个QWidget的工程

2 将cef_bin文件夹拷贝到工程下:

 

3 .pro文件中引入cef

 4 开始集成

代码结构:

simple_app  simple_handler 即 cef工程中cefSimple中的文件

cefwidget 是QWidget,集成了cef

cef_delegate 是QWidget 和simplehandle中间的桥梁,负责将simplehandle的回调传递给QWidget

cefwidget

#include "cefwidget.h"
#include "ui_cefwidget.h"

#include "include/cef_request_context.h"
#include "simple_handler.h"
#include <QTimer>
#include <QDebug>
#include <QWindow>
#include <QString>
#include <Windows.h>
#pragma comment(lib, "User32.lib")

CefWidget::CefWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CefWidget)
{
    ui->setupUi(this);
    QTimer::singleShot(0,[this](){initView();});
}

CefWidget::~CefWidget()
{
    delete ui;
}



void CefWidget::initView(){
    CefWindowInfo cef_wnd_info;
    QString str_url = "http://www.baidu.com";
    RECT win_rect;
    QRect rect = this->geometry();
    win_rect.left = rect.left();
    win_rect.right = rect.right();
    win_rect.top = rect.top();
    win_rect.bottom = rect.bottom();
    qDebug() << rect;

    cef_wnd_info.SetAsChild((HWND)this->winId(), win_rect); //将cef界面嵌入qt界面中
    CefBrowserSettings cef_browser_settings;
    simple_handler_ = CefRefPtr<SimpleHandler>(new SimpleHandler());
    simple_handler_->setDelegate(this);
    CefBrowserHost::CreateBrowser(cef_wnd_info,
        simple_handler_,
        str_url.toStdString(),
        cef_browser_settings,
        nullptr,
        CefRequestContext::GetGlobalContext());



}

void CefWidget::resizeEvent(QResizeEvent *event) {

    resizeView();

}
void CefWidget::resizeView(){
    if (!simple_handler_ ) {
        return;
    }

    CefRefPtr<CefBrowser> browser = simple_handler_->GetCurrentBrowser();
    if (!browser)
    {
        return;
    }
    CefRefPtr<CefBrowserHost> host = browser->GetHost();
    if (!host) {
        return;
    }

    QRect rect = this->geometry();
    qreal ratio = this->windowHandle() ? this->windowHandle()->devicePixelRatio()
                                                : 1.0;



    HWND hwndCefBrowser = (HWND)(host->GetWindowHandle());
    if (hwndCefBrowser && ::IsWindow(hwndCefBrowser))
        ::MoveWindow(hwndCefBrowser, 0, 0, rect.width() * ratio, rect.height() * ratio, FALSE);
}

void CefWidget::OnBrowserLoadEnd(const std::string& url,int identifier,int status){
   qDebug()<< "CefWidget::OnBrowserLoadEnd" << QString(url.c_str())  ;
   resizeView();
}

main:

#include "include/cef_app.h"
#include "cefwidget.h"

#include <QtWidgets/QApplication>

#include "simple_app.h"

/**
 * 初始化QT以及CEF相关
 */
int init_qt_cef(int& argc, char** argv)
{
    const HINSTANCE h_instance = static_cast<HINSTANCE>(GetModuleHandle(nullptr));

    const CefMainArgs main_args(h_instance);
    const CefRefPtr<SimpleApp> app(new SimpleApp); //CefApp实现,用于处理进程相关的回调。

    const int exit_code = CefExecuteProcess(main_args, app.get(), nullptr);
    if (exit_code >= 0)
    {
        return exit_code;
    }

    // 设置配置
    CefSettings settings;
    settings.multi_threaded_message_loop = true; //多线程消息循环
    settings.log_severity = LOGSEVERITY_DISABLE; //日志
    settings.no_sandbox = true; //沙盒

    CefInitialize(main_args, settings, app, nullptr);

    return -1;
}


int main(int argc, char* argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);  // 解决高DPI下,界面比例问题
    QApplication a(argc, argv);
    const int result = init_qt_cef(argc, argv);
    if (result >= 0)
    {
        return result;
    }

    CefWidget w;
    w.show();
    a.exec();

    CefShutdown(); // 关闭CEF,释放资源

    return 0;
}

效果:

 小问题:在cef的OnLoadEnd回调到来之前,应该加载一个动画之类的,先不让cefview显示出来,此时的cef正在初始化,尺寸还不对;以后处理吧

运行:

将cef_bin目录下的Release Resources中的文件拷贝到qt生成的可执行文件的目录下,即可成功运行 

工程:

qt+cef集成demo-互联网文档类资源-CSDN下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt集成cef QWidget 的相关文章

  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • QML 适合所有分辨率的屏幕

    大家好 我的 QML 代码有问题 我犯了一个错误 我给元素设置了一定的大小 现在我在将应用程序放在其他设备上时遇到了问题 我会将我的代码粘贴到有宽度和高度的位置 以便您可以更改它以向我展示如何使用动态调整大小 我需要说我正在使用以下代码从
  • Qt 的最佳实践包括和预编译头文件?

    当使用现代和最新的 C 编译器 例如 MSVC2015 并激活预编译头时 当前关于包含 Qt 头文件的 最佳实践 是什么 Example include
  • 如何安排函数在 Qt for Python 的主 UI 线程上运行?

    我正在移植一个 Python GTK 应用程序 因此它使用 Qt for Python PySide2 它使用Python标准实现工作线程threading模块和工作线程使用Gdk threads add idle 与主 GUI 线程交互
  • Qt Designer 与手动编码

    每次我使用图形工具包开始一个项目时 第一个冲突就会发生在如何处理视觉设计和小部件布局的决定上 图形工具还是手动编码 这是一个非常棘手 主观的问题 因为大多数人会根据个人喜好来决定 它还很大程度上取决于图形工具的质量 在这种情况下 我想只关注
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • QT“找不到 Qt 平台插件“xcb””

    我出于学术原因安装了QT everywhere 5 15开源版 但无法运行程序 首先 我编译了必要的源文件make并安装了QT Creator 然后我选择qmake来运行其中的程序 当我尝试运行示例程序时 遇到以下错误 qt qpa plu
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 关于 GUI 计时器显示后台线程已用时间的建议?

    Issue 我有一个 PyQt GUI 用户按下按钮即可启动后台线程 workerThread 它是从QThread 我想要一个计时器显示 以QLabel 显示自此以来已经过去了多少时间workerThread开始 我希望这个计时器在wor
  • 如何使用 Qt Test 控制 QFileDialog?

    我有两个问题 我怎样才能访问QFileDialog并使用 Qt Test 模块在 文件名 字段中写入文件的路径 我这么问是因为我正在 Qt 中开发一些 GUI 测试 现在我需要打开一个文本文件 以下代码创建QFileDialog并获取文件路
  • Mac OS X 文件关联有效,但文件图标未更改

    我使用 Qt 5 3 2 开发了一个 Mac 应用程序 该应用程序处理具有特定扩展名的文件 比方说 xyz 我创建了一个名为 XYZ icns 的图标文件 并将其添加到我的应用程序包资源文件夹中 MyApp app Contents Res
  • Qt、PushButton、id 属性?有什么方法可以知道点击了哪个按钮

    void MainWindow addRadioToUI int button cunter 4 while database isEmpty button cunter QPushButton one new QPushButton Pl
  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • QToolBar 的菜单延迟

    我通过制作 QAction 并向其添加 QMenu 在 QToolBar 上有一个菜单 如何消除单击图标时出现菜单之前的延迟 QToolBar myToolBar new QToolBar this QAction myAction new
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom

随机推荐

  • 1011 A+B 和 C

    给定区间 231 231 内的 3 个整数 A B 和 C 请判断 A B 是否大于 C 输入格式 输入第 1 行给出正整数 T 10 是测试用例的个数 随后给出 T 组测试用例 每组占一行 顺序给出 A B 和 C 整数间以空格分隔 输出
  • linux下更改文件的权限

    更改所属组 chgrp 语法 chgrp 组名 文件名 root localhost groupadd testgroup root localhost touch test1 root localhost ls l test1 rw r
  • SQL巧用表的自连接和运算符代替排序的几个例子

    MySQL巧用表的自连接和运算符代替排序的几个例子 目录 MySQL巧用表的自连接和运算符代替排序的几个例子 例1 SQL18 例2 SQL23 例3 SQL87 例1 SQL18 获取当前薪水第二多的员工的emp no以及其对应的薪水sa
  • Spring Boot项目的真实程序入口

    基于 spring boot start开发的项目 其程序入口并不是我们开发的业务代码中定义了 main 函数的类 而是 Spring Boot 定义的 JarLauncher 类 下文源码反编译自 spring boot loader 1
  • 遇到bug我们如何分析定位?

    前言 日常工作中 每天可能都会遇到不同的bug 有些刚入行的测试喜欢不加分析就直接甩给开发去解决 开发比较闲还好 如果手头工作比较多 就容易烦 甚至有可能是后端的问题 但是你却把问题丢给了前端 这种事情发生的次数多了 就比较容易暴露水平 那
  • ConcurrentHashMap 常见面试题详解

    ConcurrentHashMap 1 ConcurrentHashMap的数据结构 数组 链表 采用了分段锁的实现机制 2 ConcurrentHashMap初始化 首先会创建segment数组 长度为默认 16 或传入的并发值的大于等于
  • Objective-C中的block

    在Objective C的开发过程中 我们经常用到block 这里就简单总结一下block在Objective C的几种使用方式 1 简单介绍一下block 代码块Block是对C语言的扩展 用来实现匿名函数的特性 Block是一种特殊的数
  • QIIME2-单端数据Deblur

    QIIME2学习 QIIME2分析之单端数据的导入与Deblur 文章目录 QIIME2学习 前言 一 导入数据 查看文件的原始数据的序列数等信息 导出qzv文件查看 二 Deblur 1 按测序碱基质量过滤序列 2 去噪16S过程 3 输
  • 了解 node周边生态

    前言 Node js 周边的生态非常强大 NPM Node包管理 上有超过60万个模块 日下超过载量3亿次 但对新人和其它语言背景的开发者来说 了解node周边生态不是一件容易的事 在入门之前需要弄懂不少复杂的概念 废话不多说 来看看本次分
  • Windows Ubuntu 双系统安装教程

    基本步骤 1 确定自己的硬盘分区 并分区 以我120G固态硬盘 500G机械硬盘的笔记本电脑为例 不打游戏的码农 win用于生活 ubuntu用于工作 C盘 80G固态硬盘 设为ntfs文件格式 用来放Windows系统及相关软件 分区 大
  • Vue中mapbox的使用

    Vue中mapbox的使用 1 首先下载包文件 cnpm i mapbox gl S 2 导入包文件 main js中导入 import mapBoxGl from mapbox gl Vue prototype mapboxgl mapB
  • jwt 私钥_基于JWT的token弱密钥爆破

    JSON Web Token JWT 是目前最流行的跨域身份验证解决方案 直接根据token取出保存的用户信息 以及对token可用性校验 大大简化单点登录 JWT header payload signature 以 相隔 例 eyJhb
  • SpringBoot3基础:最简项目示例

    说明 本文建立一个最基本的SpringBoot3项目 依赖项仅包含 spring web SpringMVC 备注 SpringBoot3需要JDK17支持 配置方法参考 SpringBoot3项目中配置JDK17 项目结构图示 POM
  • 现在学UI设计有前途吗?UI设计收入大概多少

    随着互联网的高速发展以及大量的人奔涌进入UI设计行业 我们发现想要通过UI实现高薪就业变得不再容易 这让很多人担忧 现在学UI设计还有前途吗 千锋郑州UI设计老师从市场需求 就业薪资以及职业发展方向三个角度分析后可以负责的告诉你有前途 UI
  • docke的基础入门

    docker基础入门操作 一 如何安装docker 一 如何安装docker 安装docker命令通过一下命令顺序执行 即可进行安装 校验操作系统内核版本 要求是3 10以上的版本 1 安装一些必要的系统工具 其中yum utils包含yu
  • 由于找不到vcomp140.dll无法继续执行此代码?该怎么修复呢?

    在使用计算机过程中 我们有时会遇到缺少vcomp140 dll文件的问题 这可能导致某些应用程序无法正常运行 遇到了缺少vcomp140 dll文件的问题 这给我的正常工作和娱乐带来了一些困扰 经过一番努力 我成功修复了这个问题 并对此总结
  • shell中括号的特殊用法 linux if多条件判断

    shell中括号的特殊用法 linux if多条件判断 一 bash 单双括号 基本要素 两个符号左右都要有空格分隔 内部操作符与操作变量之间要有空格 如 a b 字符串比较中 gt lt 需要写成 gt lt 进行转义 中字符串或者 变量
  • Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getM的原因及解决办法

    一 原因 从别人那里拿来的gradle项目 然后自己用idea跑的时候报错 Cause org jetbrains plugins gradle tooling util ModuleComponentIdentifierImpl getM
  • linux 解锁用户被锁

    一般我们在开发时部署好了环境 有时候用xshell 登录服务器时我们经常会忘记用户的登录密码 我们经常会遇到用户被锁定 首先 用root 用户查看 查看被锁用户的错误登录次数 pam tally2 u tom tom 为用户 pam tal
  • qt集成cef QWidget

    编译libcef dll wrapper 假设你已经编译出了libcef dll wrapper lib Debug和Release版本 并且对应版本的程序集类型分别是 MDd和MD qt的运行时库是MDd类型的 因此cef3编译的时候也应