М
26 апреля 2019 г. 5:46

Как в 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;
}
Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking
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
М
  • 26 апреля 2019 г. 6:34
  • (ред.)

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

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
М
  • 26 апреля 2019 г. 9:35
  • (ред.)

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

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

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
МБ
14 июля 2019 г. 17:57
Максим Беликов

C++ - Тест 005. Структуры и Классы

  • Результат:100баллов,
  • Очки рейтинга10
МБ
14 июля 2019 г. 17:52
Максим Беликов

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:90баллов,
  • Очки рейтинга8
МБ
14 июля 2019 г. 17:45
Максим Беликов

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

  • Результат:71баллов,
  • Очки рейтинга1
Последние комментарии
16 июля 2019 г. 15:15
Евгений Легоцкой

Конечно )) На самом деле не все читали Шлее... я например не читал ))
16 июля 2019 г. 15:05
IscanderChe

Так пример с QLocalServer и QLocalSocket я целиком переписал с QTcpSocket и QTcpServer из книги Шлее. Принципиальное отличие - где коннект ставить. :)) Разве что на это упор сделать. Но я могу...
16 июля 2019 г. 14:47
Евгений Легоцкой

Лучше API ))) Кстати, по использованию QLocalServer и QLocalSocket на сайте нет статей, было бы очень полезно и хорошо пошло бы в раздел Qt.
16 июля 2019 г. 12:36
IscanderChe

Да, прямой доступ не предполагается. Впрочем, можно, конечно, и напрямую. Всё равно всё локально происходит. Проблема в том, как донести сведения об изменениях в базе, которые вносит клиент, д...
b
16 июля 2019 г. 8:38
bbb116

спасибо, до smart pointer еще не дошел )
Сейчас обсуждают на форуме
17 июля 2019 г. 11:49
Михаиллл

В настройкак указан индификатор проекта и ключ. Осталось понять как использовать ключ. Попробовал вставить в этот запрос 'https://[PROJECT_ID].firebaseio/users/jack/name.json?access_to...
b
17 июля 2019 г. 9:01
bbb116

Вообщем работает только если делать setSceneRect только в конструкторе главного окна, если потом менять rect например при вставке картинки то появляются сколлы все как надо только области не р...
17 июля 2019 г. 5:54
Алексей Внуков

хочу не стандартный набор символов, а все ненужное убрать чтоб не мешало. для начала решил посмотреть как работает клава на родном примере, а он на телефоне не взлетел вот и начал разби...
17 июля 2019 г. 5:06
Михаиллл

Добрый день.Возможно вы сталкивались с облаками.Нужно из Qt создавать на облаке папки, записывать в папки файлы, читать и удалять с компьютера файлы.Возможно знаете, что лучше и проще испол...
Ищу работу?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB