繁体   English   中英

如何从c ++中更改QML项的属性

[英]How to change property of QML item from c++

我正在用C ++编写一个小型QT(5.12)应用程序,它每秒都会成为QMap的中心。 我正在尝试更新坐标,以便中心刷新,但在调试之后,它始终保持不变(原始值)。 这是我第一次使用QML尝试,所以我正在帮助自己处理下面的链接,但显然我没有做正确的事情。

https://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html

定时器每秒调用一次更新函数

#include <QQmlEngine>
#include <QQmlComponent>

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));

    // Using QQmlComponent
    QQmlEngine engine;
    QQmlComponent component(&engine,QUrl(QStringLiteral("qrc:/Map.qml")));
    QObject *object = component.create();
    QObject *map = object->children().at(1);

    if (map)
    {
        map->setProperty("newLatitude", Lat);
        map->setProperty("newLongitude", Lon);
        std::cout << "Property value:" << map->property("latitude").toDouble() << std::endl;
        std::cout << "Property value:" << map->property("longitude").toDouble() << std::endl;
    }
}

Map.qml

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

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

    property alias newLongitude : map.longitude;
    property alias newLatitude : map.latitude;

    Plugin {
        id: mapPlugin
        name: "esri"
    }

    Map {
        id: map
        anchors.fill: parent
        maximumZoomLevel: 15
        minimumZoomLevel: 15
        width: 512
        height: 512
        plugin: mapPlugin
        center {
            property real latitude: 45.5082047
            property real longitude: 13.5757492
        }
        zoomLevel: 14
    }
}

通过做这个:

    // Using QQuickView
    QQmlEngine engine;
    QQmlComponent component(&engine,QUrl(QStringLiteral("qrc:/Map.qml")));
    QObject *object = component.create();
    QObject *map = object->children().at(1);

您正在创建一个新的本地视图实例。 因此,您不会修改当前视图。

最容易向您的视图发送数据的是使用信号/插槽。 或者,您可以将组件上的指针传递给MainWindow

例如:

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    property int foobar: -1
    Label {
        text: foobar
    }
}
class Worker: public QObject
{
public:
    Worker(QObject* map): QObject(),
        map(map)
    {
        startTimer(500);
    }

    void timerEvent(QTimerEvent* ev)
    {
        static int i = 0;
        ++i;
        map->setProperty("foobar", i);
    }
private:
    QObject* map;
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QObject* obj = engine.rootObjects().first();

    Worker* worker = new Worker(obj);

    return app.exec();
}

信号/槽的快速示例(当Worker类不必知道内部组件时很有用):


ApplicationWindow {
    visible: true
    width: 640
    height: 480

    function update(value) {
        label.text = value;
    }

    Label {
        id: label
        text: "None"
    }
}
class Worker: public QObject
{
    Q_OBJECT
public:
    Worker(): QObject()
    {
        startTimer(500);
    }

    void timerEvent(QTimerEvent* ev)
    {
        static int i = 0;
        ++i;
        emit update(i);
    }

signals:
    void update(QVariant newValue);
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QObject* obj = engine.rootObjects().first();

    Worker* worker = new Worker();

    QObject::connect(worker, SIGNAL(update(QVariant)), obj, SLOT(update(QVariant)));
    return app.exec();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM