2016-06-23 31 views
0

Ich versuche, eine Liste von QML nach C++ zu senden. Ich habe versucht, mit einem String und einer ganzen Zahl mit Erfolg, aber wenn ich mit einem QVariant versuchen bekomme ich den Fehler:QVariant von QML an C++ übergeben

QObject::connect: No such slot MyClass::cppSlot(QVariant) in ../test_2206/main.cpp:31

Meine 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) 
       } 
      } 
    } 

} 

Mein 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(); 
} 

Mein 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 

Meine MyClass.cpp

#include "myclass.h" 

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

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

Ich verstehe nicht, warum ich nicht einen QVariant Parameter in diesem Signal setzen. Jede Hilfe ist willkommen :)

+0

Haben Sie versucht, mit var (anstelle von Variante): Der Variant-Typ ist ein generischer Eigenschaftstyp. Es ist veraltet und existiert nur, um alte Anwendungen zu unterstützen; Neue Anwendungen sollten stattdessen var type-Eigenschaften verwenden. – RvdK

+0

Wollen Sie auch explizit Variante verwenden? listCloud ist eine Liste mit Strings, also würde QStringList auch funktionieren. – RvdK

+0

Ich möchte Variante verwenden, weil ich Liste der Zeichenfolge aber auch Liste des Objekts übergeben muss. Du denkst ich sollte 'property var listCloud' anstelle von' property vairant listCloud' schreiben? – Cam

Antwort

1

Ändern Sie Ihren Steckplatz, um seine Parameter nach Wert und nicht per Referenz zu erhalten. Wie folgt aus:

void cppSlot(QVariant msg); 

Ich denke, es hat etwas mit QML weigern zu tun hat Window ‚Eigentum durch Verweis übergeben. Wie auch immer, Qt sendet oft das Signal by-value, auch wenn Ihre Signal/Slot-Signatur [s] die Argumente by-reference deklariert. Weitere Informationen zum Thema finden Sie unter this und that

Verwandte Themen