QWebChannel не выполняется с условием (JS to C++)

Связано с этим ответом: /questions/34969382/kak-ispolzovat-qt-webengine-i-qwebchannel/55085874#55085874

Я пробовал пример, и все работает нормально. Но я нашел кое-что интересное. Если бы у меня было условие, QWebChannel, похоже, не работает (от JS до C++).

Вот пример (основанный на предыдущем источнике сообщения):

      QWebEngineView * browser = new QWebEngineView;
browser->resize(QSize(800,600));
browser->show();
browser->load(QUrl("http://www.wikipedia.org"));

QWebChannel channel;
JsInterface jsInterface;
browser->page()->setWebChannel(&channel, 42);
channel.registerObject(QString("JsInterface"), &jsInterface);

QObject::connect(browser, &QWebEngineView::loadFinished, [&browser](bool ok)
{
    qDebug()<<"Load Finished " << ok;

    // TEST CODE HERE
    QString code = QStringLiteral(
    R"DELIM(

    var links = document.getElementsByTagName('a');
    for ( var i=0; i<links.length; ++i)
    {
        links[i].style.backgroundColor = 'yellow';
    };

    )DELIM");
    browser->page()->runJavaScript(code, 42);

    browser->page()->runJavaScript(qWebChannelJs(), 42);

    QString code2 = QStringLiteral(
    R"DELIM(
    window.webChannel = new QWebChannel(qt.webChannelTransport, function( channel)
    {
        var cpp = channel.objects.JsInterface;
        cpp.log("Hello from JavaScript");
    });

    )DELIM");
    browser->page()->runJavaScript(code2, 42);
}

Этот работает. У меня вывод интерфейса LOG from JS: Hello from JavaScript.

Но если я добавлю условие тестирования, оно не сработает:

      bool testwebchannel_main = true;

if ( testwebchannel_main )
{
    QWebEngineView * browser = new QWebEngineView;
    browser->resize(QSize(800,600));
    browser->show();
    browser->load(QUrl("http://www.wikipedia.org"));

    QWebChannel channel;
    JsInterface jsInterface;
    browser->page()->setWebChannel(&channel, 42);
    channel.registerObject(QString("JsInterface"), &jsInterface);

    QObject::connect(browser, &QWebEngineView::loadFinished, [&browser](bool ok)
    {
        qDebug()<<"Load Finished " << ok;

        // TEST CODE HERE
        QString code = QStringLiteral(
        R"DELIM(

        var links = document.getElementsByTagName('a');
        for ( var i=0; i<links.length; ++i)
        {
            links[i].style.backgroundColor = 'yellow';
        };

        )DELIM");
        browser->page()->runJavaScript(code, 42);

        browser->page()->runJavaScript(qWebChannelJs(), 42);

        QString code2 = QStringLiteral(
        R"DELIM(
        window.webChannel = new QWebChannel(qt.webChannelTransport, function( channel)
        {
            var cpp = channel.objects.JsInterface;
            cpp.log("Hello from JavaScript");
        });

        )DELIM");
        browser->page()->runJavaScript(code2, 42);
    }
}

Ничего со стороны JS .. JSinterface не вызывается.

Есть идеи, почему это приложение?

1 ответ

Хорошо, я отвечаю на свой вопрос, это была проблема с масштабом. Вот правильный код:

      bool testwebchannel_main = true;

if ( testwebchannel_main )
{
    QWebEngineView * browser = new QWebEngineView;
    browser->resize(QSize(800,600));
    browser->show();
    browser->load(QUrl("http://www.wikipedia.org"));

    QWebChannel * channel = new QWebChannel;
    JsInterface * jsInterface = new JsInterface;
    browser->page()->setWebChannel(channel, 42);
    channel.registerObject(QString("JsInterface"), jsInterface);

    QObject::connect(browser, &QWebEngineView::loadFinished, [&browser](bool ok)
    {
        qDebug()<<"Load Finished " << ok;

        // TEST CODE HERE
        QString code = QStringLiteral(
        R"DELIM(

        var links = document.getElementsByTagName('a');
        for ( var i=0; i<links.length; ++i)
        {
            links[i].style.backgroundColor = 'yellow';
        };

        )DELIM");
        browser->page()->runJavaScript(code, 42);

        browser->page()->runJavaScript(qWebChannelJs(), 42);

        QString code2 = QStringLiteral(
        R"DELIM(
        window.webChannel = new QWebChannel(qt.webChannelTransport, function( channel)
        {
            var cpp = channel.objects.JsInterface;
            cpp.log("Hello from JavaScript");
        });

        )DELIM");
        browser->page()->runJavaScript(code2, 42);
    }
}
Другие вопросы по тегам