М
April 26, 2019, 3:46 p.m.

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

Qt, QWebEngineView, html

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

  1. void MainWindow::on_testButton_clicked()
  2. {
  3. QString htmlString = "";
  4. ui->webEngineView->page()->toHtml([&htmlString](const QString& data){htmlString = data; } );
  5. qDebug()<<htmlString;
  6. }
3
The question is asked by the articleQt/C++ - Lesson 036. QWebView – How to make simple browser on the Qt

Do you like it? Share on social networks!

12
Evgenii Legotckoi
  • April 26, 2019, 3:48 p.m.

Добрый день!

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

    М
    • April 26, 2019, 3:52 p.m.

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

      Evgenii Legotckoi
      • April 26, 2019, 4:03 p.m.

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

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

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

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

      1. signals:
      2. void getHtml(QString html);
      3.  
      4. private slots:
      5. void onLoadFinished();
      6. void handleHTML(QString html);

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

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

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

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

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

      1. void WizardMapWebDialog::handleHTML(QString html)
      2. {
      3. // ToDo something
      4. }

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

        М
        • April 26, 2019, 4:34 p.m.
        • (edited)

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

        1. void MainWindow::handleHTML(QString html)
        2. {
        3. qDebug()<<html;
        4. }

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

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

        1. ui->webEngineView->page()->toHtml([this](const QString& result) mutable { emit getHtml(result); });
          Evgenii Legotckoi
          • April 26, 2019, 4:41 p.m.
          • (edited)

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

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

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

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

            М
            • April 26, 2019, 4:46 p.m.

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

            1. qDebug()<<html;

            в handleHTML(QString html)?

              Evgenii Legotckoi
              • April 26, 2019, 4:54 p.m.
              • (edited)

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

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

              1. m_webView->page()->load(QUrl("target url"));
                М
                • April 26, 2019, 7:27 p.m.

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

                1. ui->webEngineView->setUrl(addressUrl);

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

                  Evgenii Legotckoi
                  • April 26, 2019, 7:30 p.m.

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

                    М
                    • April 26, 2019, 7:35 p.m.
                    • (edited)

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

                    1. ui->webEngineView->page()->load(addressUrl);
                      М
                      • April 26, 2019, 7:39 p.m.

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

                        ТД
                        • Dec. 10, 2019, 3:14 p.m.

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

                          Comments

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          • Last comments
                          • IscanderChe
                            April 12, 2025, 5:12 p.m.
                            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                          • AK
                            April 1, 2025, 11:41 a.m.
                            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                          • Evgenii Legotckoi
                            March 9, 2025, 9:02 p.m.
                            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                          • VP
                            March 9, 2025, 4:14 p.m.
                            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                          • ИМ
                            Nov. 22, 2024, 9:51 p.m.
                            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…