2017-05-03 3 views
1

Ich habe ein Problem mit einem MessageDialog Signal in QML. In meinem MessageDialog habe ich zwei Tasten für Ja und Nein. Ich möchte jede Taste mit einem Signal verbinden. Hier ist meine qml Datei:Wie verbinde ich ein QML-Signal mit einem C++ - Slot?

class MyClass : public QObject 
{ 
    Q_OBJECT 
public slots: 
    void cppSlot(const QString &msg) { 
     qDebug() << "Called the C++ slot with message:" << msg; 
    } 
}; 

Und hier ist, wie ich diese verwenden in Haupt:

import QtQuick 2.2 
import QtQuick.Dialogs 1.1 

Item{ 
    MessageDialog { 
     signal qmlYesSig(string msg) 
     signal qmlNoSig (string msg) 
     title: "Send data?" 
     icon: StandardIcon.Question 
     text: "Do you want to save your data on the online platform?" 
     detailedText: "Click Yes " 
     standardButtons: StandardButton.Yes | StandardButton.No 
     Component.onCompleted: visible = true 
     onYes: qmlYesSig("From yes") 
     onNo: qmlNoSig("From no") 
    } 
} 

Hier mein Schlitz ist

QQuickView view(QUrl::fromLocalFile("window.qml")); 
QObject *item = view.rootObject(); 
AddData myClass; 
QObject::connect(item, SIGNAL(qmlSignal(QString)), 
       &myClass, SLOT(cppSlot(QString))); 

view.show(); 

Es gibt mir den Fehler:

C2665: 'QObject::connect': none of the 3 overloads could convert all the argument types

Ich habe versucht viele t Ich kann aber nicht arbeiten QML-Signal und C++ - Slots. Auch ich habe das Beispiel von hier Qt doc versuchen und mir den gleichen Fehler geben.

Kann mir jemand eine Idee geben, wie man QML-Signal und C++ - Steckplätze für eine MessageDialog verbindet?

+0

Wo haben Sie das Signal 'qmlSignal' definiert? Nicht in 'QObject * item = view.rootObject();' – xander

+0

Es ist das erste Mal, wenn ich mit dem Signal von qml.Ich verstehe nicht wirklich, was soll ich mehr tun.Wenn eine Taste gedrückt wird, emittiert es ein Signal, das sein sollte in C++ fangen, schreiben? – John

+0

Noch können Sie Ihr 'view.rootObject()' debuggen und sehen, dass das nicht Ihr MessageDialog ist, in dem das Signal definiert wird. Also definiere es entweder in deinem root 'Item' oder hol dir das' MessageDialog' Kind-Objekt in C++, um das Signal zu verbinden. – xander

Antwort

1

Ihre QML-Datei ist:

Item{ 
    MessageDialog { 
     signal qmlYesSig(string msg) 
     signal qmlNoSig (string msg) 

     [...] 
    } 
} 

Und Ihre C++ Code ist:

QObject *item = view.rootObject(); 
AddData myClass; 
QObject::connect(item, SIGNAL(qmlSignal(QString)), 
       &myClass, SLOT(cppSlot(QString))); 

Es bedeutet, dass Sie für ein Signal namens „qmlSignal“ im Root-Element Ihrer QML-Datei suchen. Das Stammelement ist einfach

Item{} 

Wie Sie sehen können, gibt es kein Signal „qmlSignal“ genannt.

Sie müssen das Signal im Root-Element definieren und aus dem Meldungsfeld ausgeben.

Item{ 
    signal qmlSignal(string msg) 

    MessageDialog { 
     onYes: parent.qmlSignal("From yes") 
     onNo: parent.qmlSignal("From no") 
    } 
} 
+0

Danke dydil. Das funktioniert, aber ich habe einige Fehler, wenn ich "QObject * item = view.rootObject();" Es heißt: "kann 'QQuickItem *' nicht in 'QObject *' konvertieren." Hast du eine Idee, warum ist das so? – John

+1

@Adi QQuickItem ist ein QObject, also ist das Problem wahrscheinlich, dass Sie '#include ' vergessen haben. – dydil

+0

Ja, das war :) Danke – John

2

Sie können C++ QObject auf QML Motor aussetzen und zu den Schlitzen von C++ QObject von QML Seite verbindet:

In C++ Datei:

view.rootContext()->setContextProperty("object", this); // replace this with appropriate object 

In QML:

qmlYesSig.connect(object.cppSlot); 
Verwandte Themen