我想将用QWebView编写的项目重写为QWebEngineView,但我不知道如何获取属性值并将其分配给C++变量。我想我应该使用QWebEnginePage::runJavaScript函数。但我不知道该怎么做。
例如,当我试图在控制台中显示元素的值时,我这样做了:
web->page()->runJavaScript("document.getElementById(\"login\").getAttribute(\"value\")", []
(QVariant result)->void {
qDebug()<<result.toString();
});但它什么也不显示。
发布于 2016-01-11 14:37:13
我相信您可以通过将插槽连接到QWebView的loadFinished信号来获取元素的值。代码应该类似于下面的内容。
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页面,您不能访问内部元素。我很想知道这附近有没有工作。
发布于 2018-12-12 06:05:02
runJavaScript肯定会做到这一点:下面是一个使用纯Javascript与名为“email”的字段进行交互的功能示例:
// This will set the value
this->_view->page()->runJavaScript(
"document.querySelector('input[name=\"email\"]').value = \"JKLJKLJKL\";"
);
// This will retrieve the value
this->_view->page()->runJavaScript(
"document.querySelector('input[name=\"email\"]').value;",
[](const QVariant &result){
qDebug() << "Value is: " << result.toString() << endl;
}
);请记住,QVariant的作用域仅限于回调,如果需要在函数外部使用返回值,则需要传递一个变量,该变量将一直存在,直到在[]中调用回调。
发布于 2016-01-26 21:24:20
在JS中有对DOM属性/属性的直接访问:
document.getElementById("login").value另外,我建议使用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
}https://stackoverflow.com/questions/34693830
复制相似问题