将QVariant从QML传递到C ++

时间:2016-06-23 07:43:22

标签: c++ qml

我正在尝试将一个列表从QML发送到c ++。我已尝试使用字符串和整数成功,但当我尝试使用QVariant时,我收到错误:

  

QObject :: connect:在../ test_2206 / main.cpp中没有这样的插槽MyClass :: cppSlot(QVariant):31

我的main.qml

import QtQuick 2.4
import QtQuick.Layouts 1.1
import Material.ListItems 0.1 as ListItem
import Material.Extras 0.1
import QtQuick.Controls 1.3 as QuickControls
import QtQuick.Controls 1.4
import Material 0.2


Window {
    visible: true
    property var listCloud: ["nuage1", "nuage2", "nuage3", "nuage4"]
        id: item
        width: 100; height: 100

        signal qmlSignal(variant msg)

       /* MouseArea {
            anchors.fill: parent
            onClicked: item.qmlSignal("Hello from QML")
        }*/
    Rectangle{
        id:sousRect
        color:"red"
        width:100; height:100
            Button{
                id:buttonTest
                onClicked: {
                     item.qmlSignal(listCloud)
                }
            }
    }

}

我的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlProperty>
#include <QQmlComponent>
#include <QDebug>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);   
    QQmlApplicationEngine engine;

    QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:/main.qml")));
    QObject *object = component.create();

        MyClass myClass;
        QObject::connect(object, SIGNAL(qmlSignal(QVariant)),
                         &myClass, SLOT(cppSlot(QVariant)));


    return app.exec();
}

我的myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QDebug>
#include <QString>
#include <QList>



class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);
signals:
public slots:
    void cppSlot(QVariant &msg);
};

#endif // MYCLASS_H

我的myclass.cpp

#include "myclass.h"

MyClass::MyClass(QObject *parent):
    QObject(parent)
{

}
void MyClass::cppSlot(QVariant &msg){
    qDebug() << "c++: bien reçu chef " << msg;
}

我不明白为什么我不能在此信号中加入QVariant参数。 欢迎任何帮助:)

2 个答案:

答案 0 :(得分:1)

更改您的广告位以按值接收参数,而不是通过引用。像这样:

    void cppSlot(QVariant msg);

我认为这与QML拒绝通过引用传递Window属性有关。无论如何,Qt经常发送信号按值,即使您的信号/插槽签名[s]声明参数 by-reference 。有关该主题的更多信息,请参阅thisthat

答案 1 :(得分:0)

不要在QML和C ++之间使用引用,它们将不起作用。

  

void cppSlot(QVariant &amp; msg);

您还可以在C ++中创建Q_INVOKABLE函数,并直接从QML调用它。这是这样的:

<强> main.cpp中:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlProperty>
#include <QQmlComponent>
#include <QDebug>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);   
    QQmlApplicationEngine engine;

    auto myobject = new MyClass(&app);
    engine.rootContext()->setContextProperty(QStringLiteral("myobject"), myobject);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
    {
        return -1;
    }

    return app.exec();
}

<强> mycass.h:

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QDebug>
#include <QString>
#include <QList>

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(QObject *parent = 0);

    Q_INVOKABLE void cppSlot(QVariant msg);
};
#endif // MYCLASS_H

<强> myclass.cpp:

#include "myclass.h"

MyClass::MyClass(QObject *parent):QObject(parent){}

void MyClass::cppSlot(QVariant msg)
{
    qDebug() << "c++: bien reçu chef " << msg;
}

<强> main.qml:

import QtQuick 2.4
import QtQuick.Layouts 1.1
import Material.ListItems 0.1 as ListItem
import Material.Extras 0.1
import QtQuick.Controls 1.3 as QuickControls
import QtQuick.Controls 1.4
import Material 0.2

Window 
{
    visible: true
    property var listCloud: ["nuage1", "nuage2", "nuage3", "nuage4"]
    id: item
    width: 100; height: 100

    Rectangle
    {
        id:sousRect
        color:"red"
        width:100; height:100

        Button
        {
            id:buttonTest
            onClicked: myobject.cppSlot(listCloud)
        }
    }
} 

但是如果你想使用SIGNAL SLOTS,那么QML中就会有Connections对象。你的main.qml看起来就像那样:

Window 
{
    visible: true
    property var listCloud: ["nuage1", "nuage2", "nuage3", "nuage4"]
    id: item
    width: 100; height: 100

    Connections
    {
        target: buttonTest
        onClicked: myobject.cppSlot(listCloud)
    }

    Rectangle
    {
        id:sousRect
        color:"red"
        width:100; height:100

        Button
        {
            id:buttonTest
        }
    }
}

Q_INVOKABLE不是公共SLOT,它将通过元对象系统调用。