从C ++调用QML函数

时间:2018-02-14 18:42:07

标签: c++ qt qml

我在RPI3上使用Qt。 我找到了一个QML例子,它是Tesla Car仪表盘。您可以访问herehere的完整代码。

我成功创建了一个项目并对其进行了调试。现在我试图从C ++端更改QML代码中的值。每30秒我的C ++代码中有一个计时器我试图使用QMetaObject::inokeMethod():函数更改QML代码中的速度值。我在here中阅读了所有示例。

这是我的C ++代码

#ifndef MYTIMER_H
#define MYTIMER_H
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include <QTimer>
#include <QtDebug>
class MyTimer : public QObject
{
    Q_OBJECT
public:
    MyTimer();
    QTimer *timer;
    int i=0;
public slots:
    void MySlot();
};
#endif // MYTIMER_H
#include "mytimer.h"
MyTimer::MyTimer()
{
    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(MySlot()));
    timer->start(10000);
}

void MyTimer::MySlot()
{
    i++;
    if(i==3)
    {
        i=0;
        QQmlEngine engine;
        QQmlComponent     component(&engine,QUrl(QStringLiteral("qrc:/Speedometer.qml")));
        QObject *object = component.create();
        QVariant speeds=100;
        QVariant returnedValue;
        QMetaObject::invokeMethod(object,"speedNeedleValue",
                                   Q_RETURN_ARG(QVariant, returnedValue),
                                   Q_ARG(QVariant, speeds));
         qDebug() << "From QML"<< returnedValue.toString();
         delete object;
    }
}

这是QML代码:

import QtQuick 2.4
import QtGraphicalEffects 1.0
Rectangle {
    color: "transparent"
              SpeedNeedle {
                  id: speedoNeedle
                       anchors.verticalCenterOffset: 0
                       anchors.centerIn: parent
                       focus: true
                       Keys.onPressed: {
                                if (event.key == Qt.Key_A) {
                                    speedNeedleValue(100)
                                    drive()
                               }
              }

              function speedNeedleValue(speeds) {
                  speedoNeedle.value = speeds
                  return ": I am here"
              }
 }

如果我按下&#34; A&#34;按钮我的speedNeedleValue();功能正在运行。在调试页面中,我可以获得返回数据return ": I am here"。 问题是我无法使用invoke函数设置speeds参数。 这是调试页面: &#34; https://preview.ibb.co/kqpvWS/rpi.png&#34; 每次中断我都能得到&#34;我在这里&#34;。但我也得到了#34; JIT被禁用....&#34;警告也是。 谢谢你的回答。

0 个答案:

没有答案