Qt WebEngine:如何从Lambda中获取QVariant值并更新QString?
解决QWebEngineView runJavaScript无法更新QString的问题
嘿,这个坑我之前踩过!你遇到的问题根源在于**runJavaScript是异步执行的**——你调用它之后,程序不会等JS代码跑完再继续,而是直接跳去执行后面的qDebug(),这时候Lambda里的赋值操作还没来得及触发,所以sub当然是空的。
正确的处理姿势
既然是异步操作,就得顺着它的逻辑来,把用到sub的代码放到回调里,或者用信号槽传递结果:
方案1:直接在Lambda里处理结果(最简单)
把需要使用sub的逻辑都塞进Lambda回调里,因为这个回调是JS执行完成后才会触发的:
QString sub; webviews.at(0)->page()->runJavaScript(js, [&sub](const QVariant &v){ sub = v.toString(); qDebug()<<sub; // 这里就能拿到正确的文本了 // 比如你要把sub显示到UI上、存到文件里,都可以放在这个地方 });
方案2:用信号槽传递结果(适合复杂业务)
如果你的业务逻辑不能直接写在Lambda里,可以定义一个信号,在回调里发射它,把结果传到别的地方处理:
// 先在你的类头文件里加个信号 class YourWidget : public QWidget { Q_OBJECT signals: void jsTextGot(const QString &text); }; // 然后在实现里这么写: QString sub; webviews.at(0)->page()->runJavaScript(js, [this](const QVariant &v){ QString result = v.toString(); emit jsTextGot(result); // 把结果发出去 }); // 绑定槽函数处理结果 connect(this, &YourWidget::jsTextGot, this, [&sub](const QString &text){ sub = text; qDebug()<<sub; // 这里也能拿到正确值 // 后续的业务逻辑都可以在这里处理 });
再给你捋捋代码执行顺序(为啥原来的不行)
你原来的代码执行流程是这样的:
- 创建空的
sub变量 - 调用
runJavaScript,把JS任务丢给Qt的后台线程去跑 - 马上执行
qDebug()<<sub;,这时候sub还是空的 - 过了一会儿,JS执行完了,才触发Lambda给sub赋值
所以一定要记住:异步操作的结果,只能在它的回调或者对应的信号槽里处理,不能在调用完之后直接用!
内容的提问来源于stack exchange,提问作者ktechpit.org
相关产品推荐
相关产品推荐

