QWebEngineView показать страницу только после завершения сценария JavaScript - PullRequest
0 голосов
/ 05 июня 2019

Я занимаюсь разработкой приложения C ++ Qt с веб-представлением. Вот что я пытаюсь сделать: я хочу показать веб-страницу (у меня нет контроля над ней, поэтому я не могу ее изменить, но я уверен в том, что делает эта страница, поэтому не беспокойтесь о неожиданном поведении ) для пользователя, но только после запуска некоторого JavaScript на нем. Проблема в том, что я не могу ждать JavaScript. Я использую Qt, QWebEngineView, чтобы загрузить страницу и внедрить в нее файл javascript, используя:

void MainWindow::pageloaded(bool ok)
{
    ui->webView->page()->runJavaScript(jQuery);
    ui->webView->page()->runJavaScript(waitForKeyElement,[this](const QVariant &v) { qDebug() << v.toString();ui->webView->show();});
}

jquery - это просто файл jquery.min.js, а waitForKeyElement - это это и, в основном, ожидает появления элементов страницы в DOM. В конце последнего файла я добавил свою функцию:

waitForKeyElements (".x-live-elements", scrollpage);
function scrollpage (jNode) {
    window.scrollTo(0, 80);
    tables = document.getElementsByClassName("x-content");
    table = tables[0];
    table.style.backgroundColor="transparent";
    document.body.style.backgroundColor = "transparent";
}

В основном, когда элемент класса .x-live-elements появляется в DOM, с помощью обратного вызова он прокручивает страницу вниз и устанавливает прозрачный фон таблицы и всего тела. Это работает, но я бы хотел, чтобы страница была скрыта до тех пор, пока она не будет завершена, теперь пользователь видит, что задание запущено на мгновение. В начале я вызываю метод hide() для веб-просмотра, но как вызвать show(), когда готов JavaScript? Моя идея состояла в том, чтобы добавить это в конец файла waitForKeyElement.js:

(function (){
    while(true){
        var bodyStyle = window.getComputedStyle(document.body, null);
        var bgcolor = bodyStyle.backgroundColor;
        var transparent = 'rgba(0, 0, 0, 0)';
        if (bgcolor === transparent){
            break;
        }
    } 
    a = "done";
    return a; 
})();

Когда фон страницы становится прозрачным (это, по сути, последняя необходимая мне инструкция javascript), это означает, что работа выполнена, поэтому функция должна вернуться и вызвать обратный вызов runJavascript ... но это не работает. Он застревает в цикле while навсегда и никогда не возвращается, условие if никогда не выполняется. Я знаю, что runJavascript не является синхронным, и обратный вызов запускается, как только файл javascript достигает конца, но с циклом while я должен преодолеть это ... Любая помощь ?

1 Ответ

0 голосов
/ 09 июня 2019

Лучшее, что я смог сделать, это:

Перед запуском jquery и waitForKeyElement я скрываю все тело

ui->webView->page()->runJavaScript("$('body').hide();");
ui->webView->page()->runJavaScript(jQuery);
ui->webView->page()->runJavaScript(waitForKeyElement);

Затем в waitForKeyElement.js моей функцией прокрутки стала:

function scrollpage (jNode) {
  tables = document.getElementsByClassName("x-content");
  table = tables[0];
  table.style.backgroundColor="transparent";
  document.body.style.backgroundColor = "transparent";
  $('body').show();
  window.scrollTo(0, 80);
}

Это проклятие не лучшее решение, но приемлемо для моей цели.

...