2017-11-11 91 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