2017-05-08 2 views
1

Ich kann die Signalverbindung im folgenden Code nicht funktionieren. Ich möchte dies speziell tun, indem ich das Signal an einen cpp-Slot anschließe und den Kontext nicht setze. Ich nehme an, das Problem ist, dassC++ und QML: Verbinden Sie QML-Signal mit C++ - Steckplatz

item->findChild<QObject*>("signalItem"); 

nicht das richtige Objekt finden? Hier werden die entsprechenden Code-Dateien:

main.cpp:

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQmlContext> 
#include "include/myclass.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 
    QObject * item = engine.rootObjects().value(0); 
    QObject * myObject= item->findChild<QObject*>("signalItem"); 
    MyClass myClass; 
    QObject::connect(item, SIGNAL(testSignal()),&myClass,SLOT(cppSlot())); 

    return app.exec(); 
} 

main.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.0 

ApplicationWindow { 
    visible: true 
    width: 800 
    height: 460 

    Page1 { 
     id: page1 
     visible: true 
    } 
} 

Page1.qml:

import QtQuick 2.7 
import QtQuick.Window 2.2 

Item { 
    width: 800 
    height: 460 
    id: signalItem 
    objectName: "signalItem" 
    signal testSignal() 

    CustomButton { 
     id: cppSignalButton 
     x: 14 
     y: 55 
     buttonText: "Test CPP Signal" 
     onButtonClicked: { 
      signalItem.testSignal(); 
     } 
    } 
} 

Antwort

2

Weil Sie item anschließen (main.qml) anstelle von myObject

Wenn Sie dies tun, wird es funktionieren:

QObject::connect(myObject, SIGNAL(testSignal()),&myClass,SLOT(cppSlot())); 

Eigentlich sollten Sie auch die Überprüfung hinzufügen, wenn zurückgegebenen Werte aus, dass die Funktionen nicht null sind:

QObject * item = engine.rootObjects().value(0); 
QObject * myObject= item->findChild<QObject*>("signalItem");