Qt嵌入CEF浏览器

Qt嵌入CEF浏览器

  主要记录Qt嵌入cef踩过的坑。

一、QCommandLineParse不正确使用导致无法显示网页

  Qt已经有事件循环,所以不能直接使用CEF的事件循环,需要将CEF浏览器的界面作为子窗体给Qt窗口,最重要的是初始化时调用CefExcuteProcess创建CEF的子进程,这些子进程从启动参数来看是用来渲染和gpu加速的作用,这些子进程在默认情况下会fork主进程,也就是说这些子进程的入口仍然是主进程的入口,但是启动的参数不一样。因为有这样一个设定,我踩了一个坑,在cef初始化之前调用QCommandLineParse去解析QApplication的参数,这些参数是给主进程提供的命令行参数。但是后面fork的子进程也是从这个入口进入,而且参数和主进程完全没有关系,但是还是会调用QCommandLineParse 的process接口,本来解析也是没有问题的,但是这个process有个大bug,遇到不认识的参数时会出现错误,并且会停止当前的进程,这时就意外的导致CEF创建的子进程并挂住了。Qt和CEF都给出了各自的提示信息,Qt的提示信息如下:

Unknown Options:type no-sandbox xxxxxxxx

CEF给出的提示如下:

Failed to launch GPU process.

Lost UI shared context

其实这些提示信息已经非常明显,但是刚开始不知道cef的多进程机制,再加上没有仔细了解process这个接口的错误处理机制。其实如果在debug的情况下打个断点,应该很容易发现主入口进入了多次,并且卡在了process这个函数这里。


Qt嵌入CEF浏览器
http://yoursite.com/2021/11/13/Qt嵌入CEF浏览器/
作者
还在输入
发布于
2021年11月13日
许可协议