М
Миша26 квітня 2019 р. 05: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
Evgenii Legotckoi
  • 26 квітня 2019 р. 05:48

Добрый день!

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

    М
    • 26 квітня 2019 р. 05:52

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

      Evgenii Legotckoi
      • 26 квітня 2019 р. 06:03

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

      Смотрите, из-за того, что 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 р. 06:34
        • (відредаговано)

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

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

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

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

        ui->webEngineView->page()->toHtml([this](const QString& result) mutable { emit getHtml(result); });
        
          Evgenii Legotckoi
          • 26 квітня 2019 р. 06:41
          • (відредаговано)

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

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

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

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

            М
            • 26 квітня 2019 р. 06:46

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

            qDebug()<<html;
            

            в handleHTML(QString html)?

              Evgenii Legotckoi
              • 26 квітня 2019 р. 06:54
              • (відредаговано)

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

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

              m_webView->page()->load(QUrl("target url"));
              
                М
                • 26 квітня 2019 р. 09:27

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

                ui->webEngineView->setUrl(addressUrl);
                

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

                  Evgenii Legotckoi
                  • 26 квітня 2019 р. 09:30

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

                    М
                    • 26 квітня 2019 р. 09:35
                    • (відредаговано)

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

                    ui->webEngineView->page()->load(addressUrl);
                    
                      М
                      • 26 квітня 2019 р. 09:39

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

                        ТД
                        • 10 грудня 2019 р. 04:14

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

                          Коментарі

                          Only authorized users can post comments.
                          Please, Log in or Sign up
                          AD

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

                          • Результат:50бали,
                          • Рейтинг балів-4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 11:37

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

                          • Результат:80бали,
                          • Рейтинг балів4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 11:29

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

                          • Результат:20бали,
                          • Рейтинг балів-10
                          Останні коментарі
                          ИМ
                          Игорь Максимов22 листопада 2024 р. 22:51
                          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii Legotckoi01 листопада 2024 р. 00:37
                          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZE19 жовтня 2024 р. 18:19
                          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов05 жовтня 2024 р. 17:51
                          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas505 липня 2024 р. 21:02
                          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Тепер обговоріть на форумі
                          Evgenii Legotckoi
                          Evgenii Legotckoi25 червня 2024 р. 01:11
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey115 листопада 2024 р. 17:04
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProject04 червня 2022 р. 13:49
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                          9
                          9Anonim25 жовтня 2024 р. 19:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                          Слідкуйте за нами в соціальних мережах