2017-11-11 93 views
1

我正在用C++学习Qt。无法从Qt捕获发送到QML的信号C++

最近我试图从C++发出一个信号,并基于此事件更改,我尝试更新QML中的某些内容。 emit不起作用。实际上,调试代码告诉我,emit之上和emit之后的代码行已经起作用。但emit本身不工作。

据我了解到目前为止,你emit从C++信号和on + signal name使用QML内访问该事件。

我在这里做错了什么?

这是问题的简化版本:

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

} 

回答

0

qmlRegisterType被使用时,类型被注册,所以EmitSignal对象与id:emitSignal距离em对象不同(除非类实现一个单但在你的情况下,没有),甚至如果信号是针对对象发出的,将不会为id:emitSignal的项目发出电子邮件。

如果您希望它们是同一个对象,您必须使用setContextProperty并与Connections建立连接,您也不应该调用在加载QML窗口之前发出信号的方法。

的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') 
    } 
} 

参考文献:

+0

我正在做类内的对象创建,而不是在主(在我的应用程序),所以没有办法创建一个引擎,并从主内部加载它。还是有解决办法? – Circuitdude

+0

我不理解你,更好地解释你自己。我的回答对你的问题有帮助吗?如果你想问我另外一个问题,你可以首先告诉我它是否适合你,如果你有问题,请把它标记为正确。 – eyllanesc

+0

你的班正在实施一个单身人士? – eyllanesc