之前介绍了如何miniblink集成到qt,采用wkeCreateWebWindow来创建一个浏览器窗口,wkeCreateWebWindow有三种方式
typedef enum _wkeWindowType {
WKE_WINDOW_TYPE_POPUP,
WKE_WINDOW_TYPE_TRANSPARENT,
WKE_WINDOW_TYPE_CONTROL
} wkeWindowType;
WKE_WINDOW_TYPE_POPUP 创建一个弹出式窗体,模态窗体。
WKE_WINDOW_TYPE_TRANSPARENT 透明父窗口窗体
WKE_WINDOW_TYPE_CONTROL 创建一个弹出式窗体,非模态窗体。
因为要实现成一个qtwidget的子窗体,所以用了WKE_WINDOW_TYPE_TRANSPARENT来创建浏览器窗口,qt两种方式其实应用场景很有限。
这个属性创建的窗体在win7,surface系统表现异常,出现渲染布出来问题, 只有win10 表现还过得去。最后发现是因为我同时使用了两种浏览器QtWebengineView和miniblink浏览器,这两种窗体在不同系统中兼容性存在问题。
如果只是放到qtwidget上面没有啥问题。
尝试了如下方法:
1.使用WKE_WINDOW_TYPE_POPUP/WKE_WINDOW_TYPE_CONTROL表现正常,但是跟其他窗体存在层级问题
2.使用WKE_WINDOW_TYPE_TRANSPARENT创建,将窗体独立,跟上面的基本一样,不止存在层级问题,win10多桌面显示也存在问题。
所以wkeCreateWebWindow无法满足需求。
看了一下接口文件发现一个wkeCreateWebView,该函数只是创建一个对象,并不会真正绘制,绘制需要自己处理。
1.创建对象
_hWebView = wkeCreateWebView();
wkeSetTransparent(_hWebView, false);
wkeOnPaintUpdated(_hWebView, onPaintUpdatedCallback, this);
wkeOnLoadUrlBegin(_hWebView, onLoadUrlBegin, (void *)this);
wkeOnLoadUrlEnd(_hWebView, onLoadUrlEnd, (void *)this);
wkeOnLoadUrlFail(_hWebView, onLoadUrlFailed, (void *)this);
wkeOnLoadingFinish(_hWebView, onLoadingFinish, (void *)this);
最重要的回调函数是onPaintUpdatedCallback,因为要自己绘制,改接口在需要绘制时会回调回来。原型为:
static void onPaintUpdatedCallback(wkeWebView webView, void* param, const HDC hdc, int x, int y, int cx, int cy);
返回的是HDC,所以我们需要一个绘制窗口
2.创建一个windows 窗口对象
注册窗口类:
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_DBLCLKS;// CS_HREDRAW | CS_VREDRAW; //
wcex.lpfnWndProc = webViewWndProc;<

本文介绍了将miniblink集成到qt的方法。先尝试用wkeCreateWebWindow创建浏览器窗口,发现不同系统兼容性和层级问题。后采用wkeCreateWebView,介绍了创建对象、窗口,使用GDI绘制,事件处理等步骤,还解决了win7最小化恢复未渲染问题,经测试该方法表现良好。
最低0.47元/天 解锁文章
4425





