C++ 链接已单击信号QWebEngineView
我们已经有了QWebView实现,现在我们想迁移到QWebEngineView 通过QWebView,我们已经注册了以下信号,以接收任何链接被点击或未点击的通知,我们正在QWebView中获得信号C++ 链接已单击信号QWebEngineView,c++,qt,webkit,qtwebengine,C++,Qt,Webkit,Qtwebengine,我们已经有了QWebView实现,现在我们想迁移到QWebEngineView 通过QWebView,我们已经注册了以下信号,以接收任何链接被点击或未点击的通知,我们正在QWebView中获得信号 connect(m_WebView,SIGNAL(linkClicked(const-quorl&)),SLOT(urlinkclicked(const-quorl&)) 在“urlLinkClicked”窗口中,我们正在打开新选项卡,并将该URL打开到新选项卡中 QWebEngineView存在一些
connect(m_WebView,SIGNAL(linkClicked(const-quorl&)),SLOT(urlinkclicked(const-quorl&))代码>
在“urlLinkClicked”窗口中,我们正在打开新选项卡,并将该URL打开到新选项卡中
QWebEngineView存在一些问题。由于QWebEngineView中不存在“linkClicked”这样的信号。因此,我们尝试了以下选项,但仍然无法找到解决方案
- 在main类中,我们创建了WebEngineView类实例并设置了WebEnginePage。我们可以在视图类中呈现网站,但当我们单击任何链接时,我们没有收到任何信号,因此我们无法在新选项卡中打开该新网站
m_WebEngineView=新的QWebEngineView(此);
m_WebEngineView->setPage(新的QWebEnginePage())代码>
我们还重写了“acceptNavigationRequest”方法以获取mainWebEngineView中的链接单击事件,但我们无法获取链接单击事件
有什么建议我可以试试吗
提前谢谢。我想你可以用“urlChanged”这个信号
参见官方文件页面上的标题“信号”。
如果这没有帮助,我需要知道您使用的是什么版本的Qt框架
致意
/Rasmus不幸的是,urlChanged
仅当当前页面的url发生更改时,才会发出QWebenginePage
已发出的信号。当前页面的url未更改时,也会发出上一个linkClicked
信号。有一种方法可以处理这个问题,但您需要访问页面源代码
这种功能是通过类实现的。您需要创建webChannel对象和一个特殊的回调类,该类将以您喜欢的方式处理来自网页的回调。然后,您需要在您想要的页面上设置此webChanell,并执行以下所有连接:
MyCallBackObject* callback= new MyCallBackClass();
mWebChannel = new QWebChannel(this);
mWebChannel->registerObject(QStringLiteral("MyCallBackObject"), callback);
mWebView->page()->setWebChannel(mWebChannel); // mWebView is QWebEngineView
connect(callback, SIGNAL(urlChanged(QUrl)),
this, SLOT(linkClickedSlot(QUrl))); // connect statement, urlChanged is defined in your callback class, linkClickedSlot is a slot where you process clicked signal
有关更多参考信息,请使用qt中的官方版本或会议中的官方版本或此视频在QWebEnginePage子类中覆盖QWebEnginePage::acceptNavigationRequest:
bool MyWebPage::acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame)
{
if (type == QWebEnginePage::NavigationTypeLinkClicked)
{
qDebug() << url;
}
return true;
}
bool MyWebPage::acceptNavigationRequest(const-QUrl&url,NavigationType,bool-isMainFrame)
{
if(type==QWebEnginePage::NavigationTypeLinkClicked)
{
qDebug()在继承的WebEngineView和继承的网页中使用此选项,我们可以在其中找到hoverdUrl
QWebEngineView *WebEngineView::createWindow(QWebEnginePage::WebWindowType type)
{
if(type==QWebEnginePage::WebBrowserTab)
{
if(!hoverdUrl.isEmpty())
QDesktopServices::openUrl(QUrl(hoverdUrl));
qGlobalDbg("Open external Url requiested in chat, url : " + hoverdUrl, toKIBANA|toLOG);
}
//qDebug()<<"============== link Clicked "<<hoverdUrl;
return NULL;
}
QWebEngineView*WebEngineView::createWindow(QWebEnginePage::WebWindowType)
{
如果(类型==QWebEnginePage::WebBrowserTab)
{
如果(!hoverdUrl.isEmpty())
QDesktopServices::openUrl(QUrl(hoverdUrl));
qGlobalDbg(“聊天中要求打开外部Url,Url:+hoverdUrl,toKIBANA | toLOG”);
}
//qDebug()我尝试了“urlChanged”信号,但当我们点击链接时,这也没有帮助。我使用的是Qt5.6,这不是一个很好的解决方案,但我认为你可以将“if(progress==0){QUrl url=m_WebEngineView.url();}”放在链接到m_webengineeview上loadProgress的插槽中。我刚刚意识到有一个“urlChanged”在QWebEnginePage对象上也是如此,也许可以?Oleh,你如何让QWebEngineView始终使用“myWebPage”?我知道你可以设置一个带有子类项的页面,但是如果链接指向一个新页面,它看起来像是“QWebEnginePage”类将根据QWebEngineView类用于新页面。@mazecreator如果我没记错的话,我曾经提供MyWebPage
对象。当您单击链接时,它确实是新的QWebEnginePage对象吗?我不确定。Oleh,经过快速测试,它似乎保留了“MyWebPage”单击链接后初始化。虽然有点意外,但可能是出于设计。