Как сделать синхронный вызов через QWebChannel
Я портирую код из QWebKit в QWebEngine, и у меня возникают проблемы из-за того, чтоQWebChannel
асинхронный.
Код Javascript в QWebView
/QWebEngineView
необходимо запросить код C++ для абзацев текста и добавить этот текст, пока на странице не останется места. Псевдокод для версии WebKit выглядит так:
while (there_is_space_left) {
var par = channel_to_cpp_code.getNextParagraph();
addParagraph(par);
}
Этот код синхронный и работает очень хорошо. Код для версии WebEngine не может использовать цикл, потому что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
? Есть ли идиоматические шаблоны для решения проблемы, которую я решаю?