c++ - 如何正確的使用QWebEngineView?
問題描述
自從5.6版本徹底移除qwebkit,打算使用新的web引擎,大體函數(shù)沒有改變。但是一些發(fā)現(xiàn)了一些使用c++11的匿名函數(shù)作為參數(shù)的。比如:webengineview中:void toHtml(FunctorOrLambda resultCallback) const在webkit中:QString QWebFrame::toHtml() const按理說使用時是這樣(當(dāng)loadfinished后調(diào)用):
QString html;m_view->page()->toHtml( [&](const QString &v ){ qDebug() << v;//這樣是可以的。 html = v;//這樣是直接崩潰的});//后來做個測試外部int test = 1;//添加個測試//lambda內(nèi)部test = 2;//這句在外部輸出仍然是1很奇怪qDebug() << test; //仍然是1
不太能搞明白為什么新的函數(shù)要這么設(shè)計,明明一個返回值就可以的,為什么用lambda函數(shù),本來QString html = ...->toHtml();一句搞定的,非得按照上面那樣(最主要的是按照上面那樣用,我壓根取不到值!)感覺被設(shè)計是不是有點(diǎn)為了C++11而C++11了。
問題解答
回答1:先看下面一段代碼的輸出
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看看是否還會崩潰。如果沒有,那么說明這里的調(diào)用是異步的,在調(diào)用這個lambda的時候,html已經(jīng)不存在了。
回答2:c++11的匿名函數(shù)的作用是為了異步吧,是不是你的變量html離開了作用域了。
相關(guān)文章:
1. javascript - 天貓首頁首屏數(shù)據(jù)來源2. mysql - 僅僅只是把單引號與反斜杠轉(zhuǎn)義不用prepare statement能否避免sql注入?3. macOS Sierra 10.12 安裝mysql 5.7.1出現(xiàn)錯誤4. 新入手layuiadmin,部署到tp中。想用php自已寫一個后臺管理系統(tǒng)。5. javascript - 按鈕鏈接到另一個網(wǎng)址 怎么通過百度統(tǒng)計計算按鈕的點(diǎn)擊數(shù)量6. mysql在限制條件下篩選某列數(shù)據(jù)相同的值7. php - 生產(chǎn)環(huán)境下,給MySQL添加索引,修改表結(jié)構(gòu)操作,如何才能讓線上業(yè)務(wù)不受影響?8. mysql - 拖拽重排序后怎么插入數(shù)據(jù)庫?9. javascript - 微信小程序 wx.downloadFile下載文件大小有限制嗎10. mysql 獲取時間函數(shù)unix_timestamp 問題?
