M
April 26, 2019, 5:46 a.m.

Как в 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;
}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
11

Добрый день!

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

0
M
  • April 26, 2019, 5:52 a.m.

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

0

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

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

0
M
  • April 26, 2019, 6:34 a.m.
  • (edited)

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

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

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

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

ui->webEngineView->page()->toHtml([this](const QString& result) mutable { emit getHtml(result); });
0

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

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

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

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

0
M
  • April 26, 2019, 6:46 a.m.

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

qDebug()<<html;

в handleHTML(QString html)?

0

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

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

m_webView->page()->load(QUrl("target url"));
0
M
  • April 26, 2019, 9:27 a.m.

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

ui->webEngineView->setUrl(addressUrl);

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

0

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

0
M
  • April 26, 2019, 9:35 a.m.
  • (edited)

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

ui->webEngineView->page()->load(addressUrl);
0
M
  • April 26, 2019, 9:39 a.m.

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

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
NM
July 20, 2019, 10:59 a.m.
Nikolaj Morozov

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
AD
July 19, 2019, 9:51 a.m.
Anastasia Dutchina

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
AD
July 19, 2019, 9:46 a.m.
Anastasia Dutchina

Qt - Test 001. Signals and slots

  • Result:57points,
  • Rating points-2
Last comments
July 21, 2019, 6:03 a.m.
Evgenij Legotskoj

да, наверное, 32-х разрядную поддержку уже давно поа было выкинуть. К слову, у вас много проектов под Android? Часто много где вижу вопросы о том, пишет ли кто-то вообще на Qt под мобильные си...
July 20, 2019, 2:41 p.m.
Andrej Jankovich

Очень полезная информация, увы уже выкинул поддержку 32 битных бедняг.
July 20, 2019, 9:31 a.m.
Mihailll

Вот так qDebug()<<"position:"<<event->scenePos();
July 20, 2019, 8:49 a.m.
Mihailll

Добрый день. Как можно узнать координату на графической сцене при отпускании клавиши мыши?
Now discuss on the forum
July 21, 2019, 6:07 a.m.
Evgenij Legotskoj

Если вы про этот метод QRectF MoveItem::boundingRect() const{ return QRectF (-30,-30,60,60);} То мне нужно было, чтобы координата (0,0) была по центру квадрата в его локальной си...
July 20, 2019, 11:04 a.m.
Mihailll

Так и с ресурсами работает QImage image(":/Images/Images/1.png");
July 19, 2019, 10:55 a.m.
Mihailll

Да. Там похоже каждое устройство генерирует свой токен, этот токен нужно как то получать и использовать в запросе. Но как это делать я пока не понял.
July 19, 2019, 9:31 a.m.
Mihailll

Добрый день. Повернул ListView в горизонтальное положение. При прокрутке эллементы выстраиваются у левого края окна. Как в QMK в ListView сделать центрирование по центру? ...
b
July 18, 2019, 2:27 a.m.
bbb116

Когда отрисовки не видно, объекты AreaSelector создаются (при нажатии и движении мышкой), но почему то не срабатывает paint() у них, хотя делаю update этой области. Причем эти области мо...
Looking for a Job?
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB