无法从Qt C++捕获发射到QML的信号



我正在和C++一起学习Qt。

最近我试图从C++发出信号,并根据此事件更改,我尝试更新QML中的某些内容。emit不起作用。事实上,调试代码告诉我,emit上方和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')
    }
}

使用 qmlRegisterType 时,正在注册类型,因此具有 id:emitSignalEmitSignal 对象与 em 对象不同(除非类实现了单例,但在您的情况下不是(,即使为对象发出信号 em 也不会为具有 id:emitSignal 的项目发出

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

主.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();
}

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

引用:

  • http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html

相关内容

  • 没有找到相关文章

最新更新