You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:18:23