c++ - 使用Lamda从QWebEngineView中的QWebEnginePage获取HTML

标签 c++ qt c++11 lambda qwebpage

我想获取在 QWebEngineView 中打开的网页的 HTML 代码我在 QWebEnginePage 类中使用 toHtml() 函数,就像这样

QWebEnginePage *page = ui->widget->page();
QString HTML = "";
page->toHtml([&HTML](QString html){qDebug() << "code \n\n\n" << html;});

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

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 变量中,以便我可以在函数外使用它
提前致谢

最佳答案

您的问题是由 lambda 异步运行引起的。所以它真的是在你退出调用 toHtml 方法的方法之后调用的,这也解释了崩溃 - HTML 是已经退出的方法中的局部变量所以 lambda 只是随机破坏了曾经被 HTML 变量占用的内存。

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

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();
                  });
}

关于c++ - 使用Lamda从QWebEngineView中的QWebEnginePage获取HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45363190/

相关文章:

c++ - Clang 链接器说符号未定义

c++ - 虚函数实现缺少类型说明符

c++ - OpenCV 与 QT 的集成

c++ - 如何在没有对象的情况下执行槽函数?

c++ - 指针中的 constexpr 有区别吗

c++ - Qt - std::unordered_map - 销毁时间

c++ - 噪音功能实际上是如何工作的?

c++ - 限定词错误

c++ - 仅使用 STL 循环打印 map 值

c++ - QT5 的 POST 请求