М
Миша26. April 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

12
Evgenii Legotckoi
  • 26. April 2019 05:48

Добрый день!

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

    М
    • 26. April 2019 05:52

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

      Evgenii Legotckoi
      • 26. April 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. April 2019 06:34
        • (bearbeitet)

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

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

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

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

        ui->webEngineView->page()->toHtml([this](const QString& result) mutable { emit getHtml(result); });
        
          Evgenii Legotckoi
          • 26. April 2019 06:41
          • (bearbeitet)

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

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

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

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

            М
            • 26. April 2019 06:46

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

            qDebug()<<html;
            

            в handleHTML(QString html)?

              Evgenii Legotckoi
              • 26. April 2019 06:54
              • (bearbeitet)

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

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

              m_webView->page()->load(QUrl("target url"));
              
                М
                • 26. April 2019 09:27

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

                ui->webEngineView->setUrl(addressUrl);
                

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

                  Evgenii Legotckoi
                  • 26. April 2019 09:30

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

                    М
                    • 26. April 2019 09:35
                    • (bearbeitet)

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

                    ui->webEngineView->page()->load(addressUrl);
                    
                      М
                      • 26. April 2019 09:39

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

                        ТД
                        • 10. Dezember 2019 04:14

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

                          Kommentare

                          Nur autorisierte Benutzer können Kommentare posten.
                          Bitte Anmelden oder Registrieren
                          Letzte Kommentare
                          A
                          ALO1ZE19. Oktober 2024 18:19
                          Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов5. Oktober 2024 17:51
                          Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas55. Juli 2024 21:02
                          QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          k
                          kmssr9. Februar 2024 05:43
                          Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                          Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                          Jetzt im Forum diskutieren
                          J
                          JacobFib17. Oktober 2024 13:27
                          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                          JW
                          Jhon Wick2. Oktober 2024 01: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. September 2024 19:09
                          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                          F
                          Fynjy22. Juli 2024 14:15
                          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                          Folgen Sie uns in sozialen Netzwerken