Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接已单击信号QWebEngineView_C++_Qt_Webkit_Qtwebengine - Fatal编程技术网

C++ 链接已单击信号QWebEngineView

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存在一些

我们已经有了QWebView实现,现在我们想迁移到QWebEngineView

通过QWebView,我们已经注册了以下信号,以接收任何链接被点击或未点击的通知,我们正在QWebView中获得信号

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”单击链接后初始化。虽然有点意外,但可能是出于设计。