2017-11-11 1 views
1

zu fangen Ich lerne Qt mit C++.Nicht in der Lage, das emittierte Signal in QML von Qt C++

Kürzlich habe ich versucht, ein Signal von C++ zu senden und basierend auf dieser Ereignisänderung habe ich versucht, etwas in QML zu aktualisieren. Die emit funktioniert nicht. In der Tat Debugging der Code sagt mir, dass die Zeile des Codes knapp über der emit und nach der emit hat funktioniert. Aber emit selbst funktioniert nicht.

Nach meinem Verständnis bis jetzt, Sie emit ein Signal von C++ und on + signal name sind im Innern der QML verwendet, um dieses Ereignis zuzugreifen.

Was mache ich hier falsch? Hier

ist die vereinfachte Version des Problems:

emitsignal.h

#ifndef EMITSIGNAL_H 
#define EMITSIGNAL_H 

#include <QObject> 

class EmitSignal : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit EmitSignal(QObject *parent = nullptr); 
    int add(int, int); 

signals: 
    void mySignal(); 

public slots: 
}; 

#endif // EMITSIGNAL_H 

emitsignal.cpp

#include "emitsignal.h" 

#include <QDebug> 

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

int EmitSignal::add(int x, int y) 
{ 
    int z = x + y; 

    qDebug() << z; 

    emit mySignal(); 

    return x + y; 
} 

main.cpp

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 

#include "emitsignal.h" 

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

    qmlRegisterType<EmitSignal>("com", 1, 0, "EmitSignal"); 

    EmitSignal em; 
    em.add(1,2); 

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

    return app.exec(); 
} 

main.qml

import QtQuick 2.8 
import QtQuick.Window 2.2 

import com 1.0 

Window { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    EmitSignal { 
    id: emitSignal 
    onMySignal: console.log('Inside the function') 
    } 

} 

Antwort

0

Wenn qmlRegisterType verwendet wird, wird die Art registriert werden, so dass die EmitSignal Objekt mit dem id:emitSignal unterscheidet sich von dem em Objekt (es sei denn, die Klasse ein Singleton implementiert, aber in Ihrem Fall ist es nicht), auch Wenn das Signal für das Objekt ausgegeben wird, wird für das Element mit id:emitSignal nicht ausgegeben.

Wenn Sie wollen, dass sie das gleiche Objekt sein, Sie setContextProperty und machen die Verbindungen mit Connections, auch sollten Sie nicht rufen Sie die Methode, die gibt das Signal vor den QML Fenster Lasten verwenden.

main.cpp

#include "emitsignal.h" 

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQmlContext> 

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

    EmitSignal em; 
    QQmlApplicationEngine engine; 
    engine.rootContext()->setContextProperty("EmitSignal", &em); // EmitSignal is the id 

    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    if (engine.rootObjects().isEmpty()) 
     return -1; 
    em.add(1,2); 
    return app.exec(); 
} 

main.qml

import QtQuick 2.8 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    Connections { 
     target: EmitSignal 
     onMySignal: console.log('Inside the function') 
    } 
} 

Referenzen:

+0

Ich mache die Objekterstellung innerhalb der Klasse und nicht im Haupt (In meiner Anwendung), also gibt es keine Möglichkeit, eine Engine zu erstellen und sie von ouside of main zu laden. Oder gibt es eine Arbeit? – Circuitdude

+0

Ich verstehe dich nicht, erkläre dich besser. Hat meine Antwort in Ihrer Frage geholfen? Wenn du mir noch eine Frage stellen willst, kannst du mir aber zuerst sagen, ob es für dich funktioniert hat, und wenn du es getan hast, bitte, markiere es als korrekt. – eyllanesc

+0

Ihre Klasse implementiert ein Singleton? – eyllanesc

Verwandte Themen