М
Миша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
                          sf

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

                          • Результат:90бали,
                          • Рейтинг балів8
                          МВ

                          Qt - Тест 001. Сигналы и слоты

                          • Результат:68бали,
                          • Рейтинг балів-1
                          ЛС

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

                          • Результат:53бали,
                          • Рейтинг балів-4
                          Останні коментарі
                          A
                          ALO1ZE19 жовтня 2024 р. 08:19
                          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов05 жовтня 2024 р. 07:51
                          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas505 липня 2024 р. 11:02
                          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          k
                          kmssr08 лютого 2024 р. 18:43
                          Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                          АК
                          Анатолий Кононенко05 лютого 2024 р. 01:50
                          Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                          Тепер обговоріть на форумі
                          J
                          JacobFib17 жовтня 2024 р. 03:27
                          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                          ИМ
                          Игорь Максимов03 жовтня 2024 р. 04:05
                          Реализация навигации по разделам Спасибо Евгений!
                          JW
                          Jhon Wick01 жовтня 2024 р. 15:52
                          Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                          КГ
                          Кирилл Гусарев27 вересня 2024 р. 09:09
                          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                          F
                          Fynjy22 липня 2024 р. 04:15
                          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

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