如何正确的使用QWebEngineView

 我来答
就烦条0o
2017-02-26 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46499
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
自从5.6版本彻底移除qwebkit,打算使用新的web引擎,大体函数没有改变。但是一些发现了一些使用c++11的匿名函数作为参数的。比如:
webengineview中:
void toHtml(FunctorOrLambda resultCallback) const
在webkit中:
QString QWebFrame::toHtml() const
按理说使用时是这样(当loadfinished后调用):
QString html;
m_view->page()->toHtml( [&](const QString &v ){
qDebug() << v;//这样是可以的。
html = v;//这样是直接崩溃的
});
//后来做个测试外部
int test = 1;//添加个测试
//lambda内部
test = 2;//这句在外部输出仍然是1很奇怪
qDebug() << test; //仍然是1
不太能搞明白为什么新的函数要这么设计,明明一个返回值就可以的,为什么用lambda函数,本来QString html = ...->toHtml();一句搞定的,非得按照上面那样(最主要的是按照上面那样用,我压根取不到值!)
感觉被设计是不是有点为了C++11而C++11了。
c++11的匿名函数的作用是为了异步吧,是不是你的变量html离开了作用域了。
先看下面一段代码的输出
int test = 1;
auto f = [&](){
test = 5;
cout<<test<<endl;
};
cout<<test<<endl; // 输出 1
f(); // 输出 5
cout<<test<<endl; // 输出也是5
所以你后面说的两个test的输出,需要好好检查一下。
然后
m_view->page()->toHtml( [&](const QString &v ){
qDebug() << v;//这样是可以的。
html = v;//这样是直接崩溃的
});
这里如果将v赋值给html会崩溃,那么就需要检查一下崩溃的原因了。
你可以先把QString html;前加上static看看是否还会崩溃。如果没有,那么说明这里的调用是异步的,在调用这个lambda的时候,html已经不存在了。
cx_star
2017-09-10
知道答主
回答量:12
采纳率:0%
帮助的人:15.3万
展开全部
html已经不存在了,runJavaScript中的lambda异步的。

用信号槽:
m_TabWindow->currentWebView()->page()->runJavaScript(ui->lineEdit->text(),[this](const QVariant& r){emit haveAResultSignal(r.toString());});

或者:
参照http://blog.csdn.net/tujiaw/article/details/52075495
{
QString runJavaScriptResult;
QSharedPointer<QEventLoop> loop = QSharedPointer<QEventLoop>(new QEventLoop());
m_TabWindow->currentWebView()->page()->runJavaScript(ui->lineEdit->text(),[loop,&runJavaScriptResult] (const QVariant& r){
if(loop->isRunning()){
runJavaScriptResult = r.toString();
loop->quit();
}
});
loop->exec();//会一直等待runJavaScript执行完毕
runJavaScriptResult2 = runJavaScriptResult;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式