QWebEngineView::createWindow()获取点击页面链接及返回值问题
QWebEngineView 标签页开发问题解答
createWindow() 返回值含义
这个函数的返回值是供新页面加载使用的QWebEngineView实例指针,Qt WebEngine内核会根据返回的结果决定新页面的加载行为:
- 返回
nullptr时:内核没有找到承载新页面的视图实例,会直接拦截本次新开页面的请求,不会执行后续跳转 - 返回
this时:内核会将当前视图作为新页面的承载容器,因此跳转的目标页面会直接覆盖加载在当前标签页中,也就是你修改返回值后观察到的现象 - 做多标签页的标准逻辑是:在这个函数里创建绑定到新标签页的QWebEngineView实例,将新实例的指针返回给内核,内核会自动把目标页面加载到这个新视图对应的标签页中。
获取点击触发的目标页面链接方法
你当前代码里调用this->url()只能拿到触发点击动作的当前页面地址,拿不到目标跳转地址——因为createWindow触发时,内核还没把目标地址设置给新页面,直接读取视图url拿不到有效值。
正确的做法是给新创建的QWebEngineView对应的QWebEnginePage绑定urlChanged信号,信号第一次触发时携带的参数就是要打开的目标链接,参考实现代码如下:
QWebEngineView* createWindow(QWebEnginePage::WebWindowType type) { if(type == QWebEnginePage::WebBrowserTab) { // 创建新标签页对应的视图实例 QWebEngineView* newTabView = new QWebEngineView(); // 监听新页面的url变化,第一次触发时拿到目标地址 connect(newTabView->page(), &QWebEnginePage::urlChanged, this, [this, newTabView](const QUrl& targetUrl){ // 这里的targetUrl就是点击触发要打开的目标页面链接 emit new_url(targetUrl); // 拿到目标地址后断开信号,避免后续页面内跳转重复触发 disconnect(newTabView->page(), &QWebEnginePage::urlChanged, this, nullptr); }); // 将新视图返回给内核,内核自动完成目标页面加载 return newTabView; } return nullptr; }
内容的提问来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

