Функция QML всегда возвращает пустое значение - PullRequest
0 голосов
/ 26 апреля 2019

Я написал небольшую программу на C ++ с QT 5.12. Моя проблема в том, что моя функция JavaScript, которая находится в файле QML, всегда возвращает пустое значение. Я попытался использовать console.log(), чтобы увидеть, действительно ли оно достигает моей функции, но в окне отладки команд ничего не пишется. Я уверен, что мой вызов C ++ достигает функции, потому что, если я удаляю ее, я получаю следующее сообщение:
No such method QDeclarativeGeoMap::qmlFunction(QVariant), также метод виден в выбранном дочернем элементе в отладчике.

Вывод, который я получаю: QML function returned: ""

Есть ли какая-либо очевидная причина, по которой мне возвращают бланк?

ОБНОВЛЕННЫЙ КОД:
mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->txtLatitude->setText("45.5075693");
    ui->txtLongtitude->setText("13.5824982");
    ui->lblStatus->setText("Ready!");

    QQmlEngine engine;
    QQmlComponent component(&engine,QUrl(QStringLiteral("qrc:/Map.qml")));
    ui->quickWidget->setSource(QStringLiteral("qrc:/Map.qml"));
    object = component.create();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnSimulate_clicked()
{
    QTimer *timer;
    if(ui->btnSimulate->text() == "Simulate")
    {
        ui->btnSimulate->setText("End simulation");
        ui->txtLatitude->setEnabled(false);
        ui->txtLongtitude->setEnabled(false);

        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(UpdateCoordinates()));
        timer->start(1000);
    }
    else {
        ui->btnSimulate->setText("Simulate");
        ui->txtLatitude->setEnabled(false);
        ui->txtLongtitude->setEnabled(false);
   }
}

void MainWindow::UpdateCoordinates()
{
    float LATDEGM = (60 * 1853.181);
    float DEG2RAD = (PI / 180.0);

    QString speedData = ui->sboxSpeed->text();
    bool ok;
    AirSpeed = speedData.toInt(&ok);

    AirCourse = (AirCourse + 360) % 360;

    Dx = AirSpeed * sin((float)AirCourse * DEG2RAD);
    Dy = AirSpeed * cos((float)AirCourse * DEG2RAD);

    QString dat = ui->txtLatitude->text();
    Lat = dat.toDouble();
    QString dat2 = ui->txtLongtitude->text();
    Lon = dat2.toDouble();

    Dx /= 3.6;
    Dy /= 3.6;

    Lat += Dy / LATDEGM;
    Lon += Dx / (LATDEGM * cos(Lat * DEG2RAD));

    ui->txtLatitude->setText(QString::number(Lat));
    ui->txtLongtitude->setText(QString::number(Lon));

    QObject* map = object->children().first();

    QVariant returnedValue;
    QVariant msg = "Hello from C++";
    QMetaObject::invokeMethod(map, "qmlFunction",
        Q_RETURN_ARG(QVariant, returnedValue),
        Q_ARG(QVariant, msg));

    qDebug() << "QML function returned:" << returnedValue.toString();
}

Map.qml

import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6

Item{
    id: itemControl
    objectName: "itemControl"
    width: 512
    height: 512
    visible: true

    property int maxZoom: 15
    property int minZoom: 15

    property real newLat: 45.5075693
    property real newLon: 13.5824982

    Plugin {
        id: mapPlugin
        name: "esri"
    }

    Map {
        id:map
        objectName: "map"
        anchors.fill: parent
        maximumZoomLevel: itemControl.maxZoom
        minimumZoomLevel: itemControl.minZoom
        width: 512
        height: 512
        plugin: mapPlugin
        center {
            latitude: itemControl.newLat
            longitude: itemControl.newLon
        }
        zoomLevel: 15

        function startupFunction(){
            console.log("Finish method");
        }

        function qmlFunction(msg) {
          console.log("Got message:", msg);
          return "some return value";
       }

        Component.onCompleted: {
            startupFunction();
        }

    }
}

1 Ответ

0 голосов
/ 29 апреля 2019

Я решил проблему с добавленным ниже кодом, прежде чем пытаться вызвать мою функцию в QML.

QObject* rt = ui->quickWidget->rootObject();
QObject* map = rt->children().at(1); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...