Как сделать синхронный вызов через QWebChannel - PullRequest
0 голосов
/ 09 июля 2020

Я портирую код с QWebKit на QWebEngine , и у меня возникают проблемы из-за того, что QWebChannel асинхронен.

Javascript код в QWebView / QWebEngineView должен запросить код C ++ для абзацев текста и добавить этот текст, пока на странице не останется места. Псевдокод для версии WebKit выглядит так:

while (there_is_space_left) {
    var par = channel_to_cpp_code.getNextParagraph();
    addParagraph(par);
}

Этот код синхронный и работает довольно хорошо. Код для версии WebEngine не может использовать l oop, потому что channel_to_cpp_code основан на QWebChannel и поэтому является асинхронным (вот псевдокод, который использует рекурсию):

function maybeAddParagraphAndRepeat() {
    if (there_is_space_left) {
        channel_to_cpp_code.getNextParagraph()
        .then(function(par) {
            addParagraph(par);
            maybeAddParagraphAndRepeat();
        });
    }
}

Этот подход намного медленнее , особенно в режиме отладки. Узким местом является цепочка асинхронных вызовов (даже если getNextParagraph возвращает жестко запрограммированную строку). С другой стороны, я не знаю, сколько абзацев потребуется для заполнения страницы, поэтому я не могу запросить все данные заранее.

Итак, общий вопрос: что делать в моем кейс. Можно ли использовать QWebChannel синхронно? Есть ли другие способы вызвать код C ++ из WebEngineView? Существуют ли идиоматические c паттерны для решения проблемы, которую я решаю?

...