М
Миша26 апреля 2019 г. 5: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 г. 5:48

Добрый день!

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

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

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

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

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

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

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

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

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

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

            qDebug()<<html;
            

            в handleHTML(QString html)?

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

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

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

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

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

                ui->webEngineView->setUrl(addressUrl);
                

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

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

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

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

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

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

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

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

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

                          Комментарии

                          Только авторизованные пользователи могут публиковать комментарии.
                          Пожалуйста, авторизуйтесь или зарегистрируйтесь
                          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
                          Последние комментарии
                          i
                          innorwall12 ноября 2024 г. 9:12
                          Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                          i
                          innorwall12 ноября 2024 г. 5:23
                          QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                          i
                          innorwall12 ноября 2024 г. 2:50
                          Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                          i
                          innorwall12 ноября 2024 г. 1:19
                          Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                          i
                          innorwall12 ноября 2024 г. 0:55
                          PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                          Сейчас обсуждают на форуме
                          i
                          innorwall12 ноября 2024 г. 7:56
                          добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                          i
                          innorwall11 ноября 2024 г. 21:55
                          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                          9
                          9Anonim25 октября 2024 г. 19:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                          ИМ
                          Игорь Максимов3 октября 2024 г. 14:05
                          Реализация навигации по разделам Спасибо Евгений!

                          Следите за нами в социальных сетях