2014-11-17 16 views
5

Sono un principiante nell'utilizzo di Qt framework. Non sono sicuro di dove sto andando male. Ho provato a guardare molti materiali correlati, ma non riuscivo ancora a capirlo.QObject :: connect: nessun segnale simile durante il collegamento dei segnali qml in C++ Qt 5.3

Sto ricevendo "QObject :: connect: nessun errore di questo tipo .." mentre ho dichiarato un segnale in un file qml.

Ecco il codice:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    //QDeclarativeView view; 
    QQmlApplicationEngine engine; 

    testclass dsc; 

    QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///test.qml"))); 
    while(component.isLoading()); 
    if (component.isError()) { 
     qWarning() << component.errors(); 
    } 

    QObject *object = component.create(); 
    QQuickItem *item = qobject_cast<QQuickItem*>(object); 

    QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant))); 
    QObject::connect(&dsc,SIGNAL(dummysignal(QVariant)),&dsc,SLOT(testslot(QVariant))); 
    dsc.dummysignal(&dsc); 
    qDebug("Entered :"); 
    engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); 

    return app.exec(); 
} 

file QML: test.qml

Item { 
    width: 800 
    height: 500 
    signal dsa(var obj) 
    SystemPalette { id: palette } 
} 

classe Test: testclass.cpp

#include <QObject> 

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

signals: 
void dummysignal(QVariant); 


public slots: 


void testslot(QVariant); 

}; 

io sono sempre questo errore:

QObject::connect: No such signal test_QMLTYPE_0::dsa(QVariant) in .. 

risposta

9

Il problema è che si sta dichiarando il parametro dsa segnale come un tipo di 'var', che è considerato un valore di javascript dal motore QML . Quindi questo viene propagato in C++ come QJSValue e la firma del segnale con cui stai cercando di connettersi è in realtà dsa(QJSValue).

Se si desidera che la firma sia dsa(QVariant), cambiare la dichiarazione del segnale in test.qml come segue:

// test.qml 

Item { 
    signal dsa(variant obj) 

    width: 800 
    height: 500 

    SystemPalette { id: palette } 
} 

Ciò dovrebbe consentire di collegare come si stava tentando con l'affermazione

QObject::connect(item,SIGNAL(dsa(QVariant)),&dsc,SLOT(testslot(QVariant))); 

(ma prima dovresti aggiornare la firma del tuo slot a void testslot(QVariant); ... altrimenti avrai solo lo stesso problema sul rovescio della medaglia con un errore "nessun simile slot")

FWIW, ecco un trucco utile per il debug di errori 'tale segnale/Slot':

// Assuming you've instantiated QQuickItem* item 
// This will print out the signature for every signal/slot on the object 
// Make sure you include <QMetaObject>, <QMetaMethod> 

const QMetaObject* metaObj = item->metaObject(); 
for (int i = 0; i < metaObj->methodCount(); ++i) { 
    QMetaMethod method = metaObj->method(i); 
    qDebug() << method.methodSignature(); 
} 
+0

Grazie per il vostro aiuto. Ho fatto riferimento a questo documento per scrivere la parte iniziale del codice che proveniva da QT e lì usano var nell'esempio anziché nella variante. http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html – atin

1

Add segnale e lo slot

#include <QObject> 

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

signals: 
    void dsa(QVariant parameter) { 
     //some code 
    } 

public slots: 
    void testslot(QVariant parameter) { 
     //some code here 
    } 

    void testslot(); 
}; 
1

QVariant era il tipo corretto di utilizzare in Qt 5.2 per mappare var parametri del segnale, ma è stato cambiato in Qt 5.3 mappare QJSValue invece: Change C++ parameter type used for var parameters in QML declared signals

se, questo è stato ripristinato nella Qt 5.4, che utilizzerà QVariant ancora per var parametri del segnale: Revert mapping of var signal parameters to QJSValue

+0

ohh okay grazie a questi cambiamenti provoca il caos per i nuovi sviluppatori che si rompono la testa perché la roba non funziona :-) – atin