М
April 26, 2019, 9:46 a.m.

Как в Qt из QWebEngineView получить html

Qt, QWebEngineView, html

Добрый день. Как в Qt из QWebEngineView получить html? Попробовал сделать так, но дебаг возвращает "" и программа вылетает

void MainWindow::on_testButton_clicked()
{
    QString htmlString = "";
    ui->webEngineView->page()->toHtml([&htmlString](const QString& data){htmlString = data; } );
    qDebug()<<htmlString;
}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
11

Добрый день!

УУУ... Это лютая хрень... Надо посмотреть исходники одного проекта дома. После работы гляну, сам пол дня убил на эту ерунду.

0
М

Спасибо, буду ждать.

0

ооо. У меня проект под рукой оказался.

Смотрите, из-за того, что WebEngine работает асинхронно, а передаваемый CallBack должен быть константным, то ничего не работает, как вы это сделали. Кроме как костылями с mutable там ничего толком не сделаешь.

Вам нужен сигнал и слот, который этот сигнал будет принимать.

То есть в заголовочном файле класса/диалога, где у вас находитя тот QWebEngineView пишем сигнал и слот, также нужен будет слот загрузки

signals:
    void getHtml(QString html);

private slots:
    void onLoadFinished();
    void handleHTML(QString html);

В конструкторе цепляем сигналы к слотам

connect(m_webView, &QWebEngineView::loadFinished, this, &WebDialog::onLoadFinished);
connect(this, &WebDialog::getHtml, this, &WebDialog::handleHTML);

А вот слот, который забирает загруженную страницу

void pWebDialog::onLoadFinished()
{
    m_webView->page()->toHtml([this](const QString& result) mutable { emit getHtml(result); });
}

Ну и обработчик

void WizardMapWebDialog::handleHTML(QString html)
{
    // ToDo something
}

Настолько костыльная штука, что хоть стой, хоть падай. А всё из-за того, что Web Engine запускается отдельным подпроцессом в программе

0
М

Сделал как у вас и функцию вывел

void MainWindow::handleHTML(QString html)
{
    qDebug()<<html;
}

функция запускается, но как получить из нее html я не понял.

из лямбда функции можно ли сразу получить html ?

ui->webEngineView->page()->toHtml([this](const QString& result) mutable { emit getHtml(result); });
0

html иожно получить только в момент завершения загрузки страницы, когда страница уже загружена ничего не получите. Я всю документацию излазил. Нет ни намёка на такую возможность.

Поэтому и нужны вот эти коннекты

connect(m_webView, &QWebEngineView::loadFinished, this, &WebDialog::onLoadFinished);
connect(this, &WebDialog::getHtml, this, &WebDialog::handleHTML);

Первый коннект - это выполнения слота во завершению загрузки страницы, а второй коннект асинхронно запускает получение html через метод toHtml через ту лямбду. Сигнал уже возвращает полученный текст, который передаётся в handleHTML. А внутри той лямбды ничего сделать не сможете в принципе.

0
М

Но почему тогда не работает

qDebug()<<html;

в handleHTML(QString html)?

0

Должно работать, полагаю, что у вас какая-то маленькая неочевидная ошибка

Вы же делаете load URL?

m_webView->page()->load(QUrl("target url"));
0
М

Нет, я сделал так

ui->webEngineView->setUrl(addressUrl);

странички загружаются

0

Попрпобуйте через load() . Я уже не помню, по какой причине я его использовал, возможно как раз по той же самой, что и у вас сейчас.

0
М

Попробовал сделать так, но тот же результат

ui->webEngineView->page()->load(addressUrl);
0
М

Но функции onLoadFinished и handleHTML срабатывали всегда

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
m
May 19, 2019, 1:49 a.m.
mahhaki

Qt - Test 001. Signals and slots

  • Result:78points,
  • Rating points2
S
May 17, 2019, 1:14 p.m.
SunBro

Qt - Test 001. Signals and slots

  • Result:42points,
  • Rating points-8
b
May 17, 2019, 4:18 a.m.
banana

C++ - Тест 003. Условия и циклы

  • Result:57points,
  • Rating points-2
Last comments
May 20, 2019, 7:20 p.m.
Евгений Легоцкой

Добрый день! Вы не думали разместить репозиторий проекта на GitHub?
P.
May 18, 2019, 2:03 p.m.
PELMYACH .

Спасибо большое! Вскоре буду разбираться!
May 18, 2019, 9:13 a.m.
Евгений Легоцкой

Добрый день! Отнимать значение общего счётчика можно в деструкторе класса кнопки QDynamicButton::~QDynamicButton(){ ResID--;} При этом я бы ещё переустанавливал значения вс...
P.
May 14, 2019, 10:33 p.m.
PELMYACH .

Здравствуйте!А не подскажите, как можно при удалении какой либо кнопки, у щётчика отнять значение?Дабы например четвёртой кнопке соответствовал ID 4, а не 5 скажем
May 6, 2019, 6:39 a.m.
Евгений Легоцкой

Добрый день. Этот урок для Qt Quick Control версии 1, Вы используете вторую версию. Здесь style уже нет, кастомизацию можно делать уже или черещ соответствующие property или через ...
Now discuss on the forum
I
May 21, 2019, 1:38 p.m.
Intruder

Всем доброго времени суток. Прошу помощи у сообщества, как начинающий программист. Есть задача реализовать динамическую библиотеку на Qt5.12.3. Поискав на просторах Интернета нашел немал...
May 20, 2019, 8:43 a.m.
Михаиллл

Кинул библиотеки в папку с проектом и в папку к компилируемым файлам.В файле проекта прописал так, но все равно выдает ту же ошибку QT += core gui networkgreaterThan(QT_MAJOR_VERSI...
May 20, 2019, 1:47 a.m.
linq

Что вы понимаете под статической сборкой приложений? В какой среде?
May 19, 2019, 10:52 a.m.
Евгений Легоцкой

Если честно, то мне нужно самому время потратить, чтобы глянуть это дело. Я использовал Flutter для разработки, а не Qt. Просто исходя из опыта, могу сказать, что по большей части всё на эмуля...
May 16, 2019, 11:08 p.m.
BlinCT

Решил через indexOf сделать. Возвращает или номер позиции где нашел символ или строку или -1 если не найдено.

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB