Доступ к объекту класса Javascript с помощью функции Qt run JavaScript - PullRequest
0 голосов
/ 06 августа 2020

Поскольку я новичок в javascript / HTML, и недавно я начал проект с использованием Qt QWebEngineView. Некоторое время я застревал в поисках лучшего способа поделиться данными из программы C ++ с Javascript. Пока что единственный способ отправить данные программе Javascript - это использовать функцию QWebEnginePage::runJavaScript. Я также заметил, что существует возможность использования QWebChannels описанного здесь , но я предпочитаю QWebEnginePage::runJavaScript за его простоту.

Единственная проблема, с которой я столкнулся до сих пор, с Метод runJavaScript заключался в том, что для записи переменной это должно быть определено в файле HTML, я на самом деле не на 100% уверен, что это единственный способ сделать это, но это был единственный способ у меня это сработало. Мой текущий сценарий выглядит примерно так:

В файле HTML:

...
        <div id="latitude" ></div>
        <div id="longitude"></div>
        <div id="heading" "></div>
...

В файле C ++:

...
     double Latitude = 44.244; Longitude = 10.3; Heading = 90;
     QString jsQuery = QObject::tr(
                "document.getElementById('latitude').innerHTML  =%1; "
                "document.getElementById('longitude').innerHTML =%2; "
                "document.getElementById('heading').innerHTML   =%3;"
                ).arg(Latitude).arg(Longitude).arg(Heading));
     mapWebView->page()->runJavaScript(jsQuery);
...

С такой настройкой я могу записывать переменные на стороне Javascript / HTML из кода C ++. Поскольку с помощью этого решения мне нужно создать столько отдельных переменных в файле HTML для каждого значения, которое я хочу отправить, я хотел спросить, можно ли вместо использования отдельных переменных использовать объект класса или объект JavaScript . Я создаю класс с некоторыми методами для записи членов класса, как показано ниже: В файле js:

...
export default class PositionState{
    setPosition(latitude = 0.0, longitude = 0.0, heading = 0.0){
        this.Latitude   = latitude;
        this.Longitude  = longitude;
        this.Heading    = heading;
    }
    getLatitude(){
        return this.Latitude;
    }
    getLongitude(){
        return this.Longitude;
    }
    getHeading(){
        return this.Heading;
    }
}

var obj = new PositionState();
...

С помощью этого решения, если я создам объект PositionState class и вызовите функцию obj.setPosition(44,10.45) из файла javascript, члены класса объекта установлены правильно, но если я попробую его из C ++, я получу несколько ошибок.

 double Latitude = 44.244; Longitude = 10.3; Heading = 90;
 Qstring jsQuery = QObject::tr(
                    "obj.setPosition(%1, %2, %3);"
                    ).arg(Latitude).arg(Longitude).arg(Heading));
mapWebView->page()->runJavaScript(jsQuery);

Если только определить obj в файле Javascript я получаю ошибку js: Uncaught ReferenceError: obj is not defined. И если я определяю переменную в файле HTML с помощью Id="obj" и запускаю тот же сценарий, я получаю ошибку js: Uncaught TypeError: obj.setPosition is not a function, ошибка возникает, даже если вместо obj.setPosition я использую document.getElementById('obj').setPosition.

Итак, то, что я получаю с моим практически отсутствующим знанием HTML / Javascript, заключается в том, что файл HTML не знает моего определения класса, поэтому не распознает метод setPosition. Итак, мой вопрос в том, есть ли способ из кода C ++ написать объект класса.

Я также пробовал использовать объект JavaScript, например var Position = {Latitude: 0, Longitude: 0, Heading: 0}, а из кода C ++ запустить сценарий с QString Position = {Latitude: 40, Longitude: 9, Heading: 20};, но также не смог изменить свойства объекта Position.

Любая помощь будет очень признательна, спасибо.

...