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

Как в 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
Вопрос задан по статьеQt/C++ - Урок 036. QWebView - пишем простейший браузер на Qt

Вам это нравится? Поделитесь в социальных сетях!

12
Evgenii Legotckoi
  • 26 апреля 2019 г. 15:48

Добрый день!

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

    М
    • 26 апреля 2019 г. 15:52

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

      Evgenii Legotckoi
      • 26 апреля 2019 г. 16:03

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

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

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

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

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

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

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

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

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

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

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

            1. qDebug()<<html;

            в handleHTML(QString html)?

              Evgenii Legotckoi
              • 26 апреля 2019 г. 16:54
              • (ред.)

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

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

              1. m_webView->page()->load(QUrl("target url"));
                М
                • 26 апреля 2019 г. 19:27

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

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

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

                  Evgenii Legotckoi
                  • 26 апреля 2019 г. 19:30

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

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

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

                    1. ui->webEngineView->page()->load(addressUrl);
                      М
                      • 26 апреля 2019 г. 19:39

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

                        ТД
                        • 10 декабря 2019 г. 15:14

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

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          • Последние комментарии
                          • IscanderChe
                            12 апреля 2025 г. 17:12
                            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                          • AK
                            1 апреля 2025 г. 11:41
                            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                          • Evgenii Legotckoi
                            9 марта 2025 г. 21:02
                            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                          • VP
                            9 марта 2025 г. 16:14
                            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                          • ИМ
                            22 ноября 2024 г. 21:51
                            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…