无法从Qt C++将信号传递到QML

3
我正在学习C++中的Qt技术。
最近我尝试从C++发出一个信号,并基于此事件尝试在QML中更新某些内容。但是发现emit不起作用。实际上,调试代码告诉我,在emit之前和之后的代码行已经执行了。但是emit本身没有起作用。
据我理解,你可以从C++中发出信号,然后在QML中使用on+signal name来访问该事件。
我在这里做错了什么?
这是问题简化版本: 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个回答

3
当使用qmlRegisterType时,将注册类型,因此具有id:emitSignalEmitSignal对象与em对象不同(除非该类实现了单例模式,但在您的情况下没有),即使发出信号也不会为具有id:emitSignal的项目发出em对象的信号。
如果要使它们成为同一对象,则必须使用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')
    }
}

References:


我正在类内部进行对象创建,而不是在主函数中(在我的应用程序中),因此没有办法从主函数外部创建并加载引擎。或者有什么解决方法吗? - Circuitdude
不,我的类没有实现单例模式。 - Circuitdude
它可以解决实际问题,所以我接受它作为答案。这没有问题。但是我的问题在于,我想在一个“类”内设置这个上下文属性,而不是在“main()”中设置。 - Circuitdude
将指向对象的指针在方法/类之间传递是不好的。这是我所读到的。 - Circuitdude
我会制作一个简化版本的问题,并在几分钟内与您分享。 - Circuitdude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接