М
26 апреля 2019 г. 4: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;
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
12

Добрый день!

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

М

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

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

Смотрите, из-за того, что 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 запускается отдельным подпроцессом в программе

М
  • 26 апреля 2019 г. 5:34
  • (ред.)

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

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

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

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

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

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

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

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

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

М

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

qDebug()<<html;

в handleHTML(QString html)?

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

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

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

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

ui->webEngineView->setUrl(addressUrl);

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

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

М
  • 26 апреля 2019 г. 8:35
  • (ред.)

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

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

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

ТД

Спасибо, работает. А ещё вопрос: как загрузить страницу с динамической подгрузкой контента по скроллингу? Например - [https://ntvplus.ru/tv/].
Пока делаю через костыль - QApplication::sendEvent(webEngineViewPage->children().at(1), new QKeyEvent(QEvent::KeyPress, Qt::Key_End, Qt::NoModifier)); Делаю так несколько раз, после этого становиться доступным весь html страницы.
Подскажите, пожалуйста, в какую сторону рыть.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
МН
25 мая 2020 г. 11:33
Митя Нагибин

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

  • Результат:50баллов,
  • Очки рейтинга-4
f
25 мая 2020 г. 5:05
falcon

C++ - Тест 001. Первая программа и типы данных

  • Результат:66баллов,
  • Очки рейтинга-1
jm
25 мая 2020 г. 3:30
just maks

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

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
26 мая 2020 г. 6:51
Евгений Легоцкой

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

У вас база данных не открылась Исправьте путь к базе данных на свой корректный в следующих методах void DataBase::connectToDataBase() bool DataBase::openDataBase()
Т1
Т1
26 мая 2020 г. 6:22
Тима 1

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

полностью повторил структору проекта. В форму дабавил tableView. Но при запуске получаю форму только с пустым tableView. Можете подсказать в чем пробелма?
26 мая 2020 г. 6:02
Евгений Легоцкой

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

Потому что это файл который нужно создать, а не библиотека. В статье есть содержание этого файла. Добавляйте в проект. Копируйте содержимое из статьи.
Т1
26 мая 2020 г. 6:00
Тима 1

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

не удается подключиить библеотеку include "database.h" выдает ошибку. Можете помочь?
Сейчас обсуждают на форуме
26 мая 2020 г. 5:16
BlinCT

Отсутствие драйвера SQLite в пакете Qt 4 на Linux

Вот честно непонимаю почему до сих пор используют qt4, там же столько всего отсутствует, много фишек и возможностей нету там. То есть используя такое старье приходится много писать самому а не и…
ДК
26 мая 2020 г. 2:24
Джон Кофи

Disable autoscroll

такие естественные решения все перепробовал. Получилось вчера так: const int maximumScroll = ui->_samples->verticalScrollBar()->maximum();const int sliderPos = ui->_samp…
26 мая 2020 г. 0:43
Ruslan Polupan

Посоветуйте новичку (базы данных и Qt, что учить)

Без БД сейчас практически никуда. Поэтому SQL надо знать. SQLite самы простой вариант, но имхо лучще начать с бд клиент-сервер. Настроить сервер. Подключаться клиентом. Просто это помогает понят…
EJ
25 мая 2020 г. 14:42
Esteban José María

Компиляция пустого проекта Qt Android

qt 5.12.8 BUILD SUCCESSFUL in 42s 28 actionable tasks: 28 executed Android package built successfully in 68.251 ms. Ну, буду разбираться по-тихоньку. :)
s
25 мая 2020 г. 13:24
sander-007

Использование файлов в памяти (memory file mapping)

Добрый вечер, проблемы работы с файлом Exel нет вообще. Весь смысл в том чтобы не создавать на диске физический файл (требования безопасности), дабы потом не чистить. А так вопрос только в этом …
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB