2016-01-09 88 views
1

我想重寫我的項目寫在QWebViewQWebEngineView,但我不知道如何獲取屬性值並將其分配給C++變量。我認爲我應該使用QWebEnginePage::runJavaScript函數。但我不知道如何。QWebEngine:如何獲取屬性值?

例如,當我嘗試在控制檯中顯示元素的值,我這樣做:

web->page()->runJavaScript("document.getElementById(\"login\").getAttribute(\"va‌​lue\")", [] 
(QVariant result)->void { 
    qDebug()<<result.toString(); 
}); 

但它無法顯示。

+0

你能告訴我們你到目前爲止所嘗試過的嗎? – nnb

+0

@nnb 例如,當我嘗試在控制檯中顯示元素的值時,我這樣做了: web-> page() - > runJavaScript(「document.getElementById(\」login \「)。getAttribute(\值)\「)」,[](QVariant結果) - > void {qDebug()<< result.toString();}); 但它什麼也沒有顯示。 – teaperr

+0

@teaperr請編輯您的問題,並在那裏添加代碼示例,而不是評論。 – Evgeny

回答

0

我相信你可以通過連接一個插槽到loadFinished信號QWebView得到你的元素的價值。代碼應該如下所示。

void WebView::onPageLoadFinished(bool status) 
{ 
    if(status) 
    { 
     QVariant value; 
     QWebFrame* frame = this->page()->currentFrame(); 
     if (frame!=NULL) 
     { 
      QWebElement element = frame->findFirstElement("input[id=login]"); 
      value = element.attribute("value"); 
     } 
     //In your case you can set a class variable instead of local variable value 
    } 
} 

這種方法是乾淨的,你甚至可以直接在時隙的開始添加URL檢查,並繼續進一步只有從你感興趣的URL傳來的信號

編輯:我只是重新閱讀你的問題,發現你想用QWebEngine來實現它。我不確定是否可以在那裏完成。根據this頁面,您無法訪問內部元素。我很想知道是否有工作。

0

還有就是直接訪問DOM屬性在JS /屬性:

document.getElementById("login").va‌​lue 

此外,我會建議使用jQuery(看看fancybrowser例子)。設置/獲取登錄輸入值的代碼是:

if(qt.jQuery('input#login').length) // can be omitted if you are sure that DOM element is ready 
{ 
    qt.jQuery('input#login').attr('value', currentUserName); //-- set value 
    return qt.jQuery('input#login').attr('value'); //-- get 
} 
0

這工作正常。

_view->page()->runJavaScript("document.querySelector(input[name=\"email\"]).value"); 

只需添加您的回調作爲第二個參數。我希望這可以幫助你。

0

這工作正常。

_view->page()->runJavaScript("document.querySelector(input[name=\"email\"]).value"); 

只需將您的回調添加爲第二個參數即可獲取該值。我希望這可以幫助你。