当前位置: 首页 > 后端技术 > Python

QT的QWebEngineView

时间:2023-03-26 16:48:39 Python

从webkit到webengine从Qt5.6开始引入了QWebEngine,抛弃了原来的QWebkit。这是一个基于chrome浏览器的引擎。为了方便起见,Qtwebenginewidgets模块提供了一个名为QWebEngineView的视图控件。要加载和显示网页,只需要以下几行:QWebEngineView*webview=newQWebEngineView;webview->load(QUrl("https://www.baidu.com/"));webview->show();QWebEngineView跳转问题是这段代码跑起来很简单,但是不要高兴得太早,然后你会发现点击页面上的链接或者去百度其他页面都跳不起来了。为什么是这样?因为我们只是一个浏览器引擎,而不是像firefox或者chrome这样的浏览器,浏览器已经提供了tab页来显示新链接,所以这里需要决定如何显示新打开的链接。实现方式有两种1、我们发现当我们点击链接的时候,会收到urlChanged信号,它的附带参数是url地址,所以如果要在这个webview上显示这个页面,可以调用它直接在绑定的slot函数中load(url)就可以了,如果你想用另一个tab显示给浏览器,只需要再创建一个QWebEngineView,加载显示即可。当然也可以跳出对话框显示。打开一个新的浏览器窗口是一样的;2.第二种方法是重写createWindow方法,默认返回NULL,所以我们看到的效果是新链接无法显示,因为你没有给它提供一个QWebEngineView。该方法中有一个WebWindowType类型的参数,enumWebWindowType{WebBrowserWindow,WebBrowserTab,WebDialog};可以看到就是我们在第一种方法中提到的三种显示,浏览器窗口视图显示,另外一个标签页显示,跳出新的对话框显示,给出你想要实现的效果即可,简单灵活。其实js中的window.open会触发这个动作,调用这个方法。示例代码:classHWebView:publicQWebEngineView{Q_OBJECTpublic:HWebView::HWebView(QWidget*parent):QWebEngineView(parent){}protected:virtualQWebEngineView*createWindow(QWebEnginePage::WebWindowTypetype){HWebView*view=newHWebView;查看->setAttribute(Qt::WA_DeleteOnClose);view->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);返回视图;}};C++和JS的交互,因为Qt内置了MetaObjectModel、signals和slots机制,使得c++和JS的交互极其简单优雅,可以说比微软的com组件还要好用。这里隆重登场的是QWebChannel,它使用QWebSocket,在C++端打开一个服务器端口,在JS客户端连接到这个端口,然后使用qt的元对象方式交换信号和槽。比较复杂,具体请看代码,很简单page()->setWebChannel(webchannel);m_webContext=newHWebContext;webchannel->registerObject(QStringLiteral("content"),(QObject*)m_webContext);首先,我们定义一个在c++和JS之间交互的对象类。这个类需要继承自QObject,添加Q_OBJECT宏,定义一些信号和槽,这样就可以使用qt的信号和槽机制。然后新建一个QWebChannel,绑定到QWebEngineView中的QWebEnginePage,使用registerObject注册我们定义的c++和JS交互Object。这样,c++端的工作就完成了。c++端其实是开了一个端口监听,并提供了一个对象给js使用。JS端要做的工作如下:varg_context;functiononClicked(){}window.onload=function(){newQWebChannel(qt.webChannelTransport,function(channel){g_context=channel.objects.content;g_context.sigClicked.connect(onClicked())});}g_context.setAction(0);加载qwebchannel.js,这个文件是安装在qt目录下的,你可以在目录中搜索找到,然后在window加载的时候使用QWebChannel,其实就是链接到c++服务器,获取我们在c++端注册的对象。内容是c++端注册时为对象设置的字符串标识。对于这个对象signal连接了一个slot函数(js函数),这样当c++端发送一个signal时,就会调用js函数,js端调用c++的slot函数更简单,就像g_context.setAction(0).清除缓存、浏览记录、cookiesQWebEngineView查看;view.page()->profile()->setPersistentCookiesPolicy(QWebEngineProfile::NoPersistentCookies);view.page()->profile()->clearHttpCache();//清除缓存view.page()->profile()->clearAllVisitedLinks();//清除浏览记录QWebEngineCookieStore*pCookie=view.page()->profile()->cookieStore();pCookie->deleteAllCookies();//清理cookiespCookie->deleteSessionCookies();//清理sessioncookies使用webenginewidgets模块部署,除了需要的库lib目录外,还有一些目录需要一起复制,即libexecqmlresourcestranslations另外写入配置文件qt.conf[Paths]前缀=。在程序运行目录下————————————————版权声明:本文为CSDN博主“ithewei”原创文章,遵循CC4.0BY-SA版权协议,转载请附上原出处链接及本声明转载。

最新推荐
猜你喜欢