0

我有一个发出信号的 C++ 类。我希望将该信号传递给 QML。我将该对象设置为 qml 应用程序引擎根上下文的上下文属性。

我的 C++ 课

// Sample.h
class Sample : public QObject
{
    Q_OBJECT
public:
    explicit Sample(QObject *parent = nullptr);

public slots:
    void emitSomething();

signals:
    void emitted();

public slots:
};

以及实施

// Sample.cpp
Sample::Sample(QObject *parent) : QObject(parent)
{
}

void Sample::emitSomething()
{
    emit emitted();
}

我的主要实现。这与 qt creator 提供的代码非常相似。

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    Sample sample;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("obj", &sample);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QTimer::singleShot(1000, &sample, &Sample::emitSomething);

    return app.exec();
}

qml 实现是

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Connections {
        target: obj
        onEmitted: function() {
            console.log("received")
        }
    }
}

当我运行代码时,emitSomething()会调用 slot,但emitted()在 qml 中看不到信号。

4

1 回答 1

2

我没有 5.9 版本,但我用 5.10.1 尝试过。在这种情况下,文本不会打印到控制台。我通过更改信号处理程序的语法来修复它。(只需删除function()。)

    Connections {
        target: obj
        onEmitted: {
            console.log("received")
        }
    }
于 2021-10-15T15:02:15.847 回答