无法从Qt C ++中将发出的信号捕获到QML中

时间:2017-11-11 13:09:22

标签: c++ qt qml qt5 qt-signals

我正在用C ++学习Qt。

最近我尝试从C ++发出信号,并根据此事件更改我尝试更新QML中的内容。 emit无效。事实上,调试代码告诉我emit之上和emit之后的代码行已经工作。但emit本身无效。

根据我的理解,直到现在,您emiton内使用来自C ++和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')
    }

}

1 个答案:

答案 0 :(得分:2)

当使用qmlRegisterType时,正在注册类型,因此EmitSignal对象id:emitSignalem对象不同(除非该类实现单例但在你的情况下它不是),即使为对象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')
    }
}

参考文献: