首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Lamda从QWebEnginePage中获取QWebEngineView中的HTML

使用Lamda从QWebEnginePage中获取QWebEngineView中的HTML
EN

Stack Overflow用户
提问于 2017-07-28 00:49:19
回答 1查看 2.3K关注 0票数 1

我想获得在QWebEngineView中打开的网页的HTML代码,我在QWebEnginePage类中使用了toHtml()函数,如下所示

代码语言:javascript
复制
QWebEnginePage *page = ui->widget->page();
QString HTML = "";
page->toHtml([&HTML](QString html){qDebug() << "code \n\n\n" << html;});

HTML页面的html代码出现在qDebug中,没有问题,这里的问题是当我想在函数外使用HTML时,当我显示HTML的大小时,它等于零,并且是空的,所以我试了一下

代码语言:javascript
复制
QWebEnginePage *page = ui->widget->page();
QString HTML = "";
page->toHtml([&HTML](QString html){HTML = html;}); // crash
qDebug() << "i want to use HTML here outside the function = " << HTML;

但是这个应用程序崩溃显示了,所以我应该做些什么,将HTML数据放在HTML变量中,这样我就可以在函数之外使用它

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-28 04:01:46

您的问题是由lambda异步运行的事实造成的。因此,在退出调用toHtml方法的方法之后才会真正调用它,这也解释了崩溃-- HTML是已经退出的方法中的一个局部变量,因此lambda随机破坏了HTML变量占用的内存。

这里要做的是同步一些事情,即阻塞方法,直到lambda被执行为止。这可以用QEventLoop来完成,但是这需要从lambda发送一个特殊的信号来指示lambda已经完成了执行。所以它看起来有点像这样(未经测试):

代码语言:javascript
复制
class MyClass: public QObject
{
    Q_OBJECT
public:
    MyClass(QWebEnginePage & page, QObject * parent = 0);

    void notifyHtmlReceived();

    QString getHtml();
    void setHtml(const QString & html) { m_html = html; }

Q_SIGNALS:
    void htmlReceived();

private Q_SLOTS:
    void requestHtmlFromPage();

private:
    QWebEnginePage & m_page;
    QString m_html;
};

MyClass::MyClass(QWebEnginePage & page, QObject * parent) :
    QObject(parent),
    m_page(page)
{}

void MyClass::notifyHtmlReceived()
{
    emit htmlReceived();
}

QString MyClass::getHtml()
{
    QEventLoop loop;
    QObject::connect(this, SIGNAL(htmlReceived()), &loop, SLOT(quit()));

    // Schedule the slot to run in 0 seconds but not right now
    QTimer::singleShot(0, this, SLOT(requestHtmlFromPage()));

    // The event loop would block until the lambda receiving the HTML is executed
    loop.exec();

    // If we got here, the html has been received and the result was saved in m_html
    return m_html;   
}

void MyClass::requestHtmlFromPage()
{
    m_page.toHtml([this](QString html)
                  {
                      this->setHtml(html);
                      this->notifyHtmlReceived();
                  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45363190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档