QML 插槽中未收到 C++ 信号

Posted

技术标签:

【中文标题】QML 插槽中未收到 C++ 信号【英文标题】:C++ Signal is not received in QML slot 【发布时间】:2021-10-15 13:11:53 【问题描述】:

我有一个发出信号的 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() 插槽被调用,但我在 qml 中看不到 emitted() 信号。

【问题讨论】:

在 qml 中,信号应该以 on 为前缀。这就是文档所说的。 我在 Qt 5.12.5 上运行了您的代码,并看到打印到控制台的“已接收”文本。您使用的是什么版本的 Qt? @JarMan 我使用 Qt 5.9 【参考方案1】:

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

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

【讨论】:

谢谢@jarMan。它解决了我的问题。

以上是关于QML 插槽中未收到 C++ 信号的主要内容,如果未能解决你的问题,请参考以下文章

C++ 和 QML:将 QML 信号连接到 C++ 插槽

带有 QQuickView 的 QML 信号 QT 插槽

将 QML 信号连接到 PySide2 插槽

PyQt 和 QML:如何在一个插槽或函数中处理多个信号

使用 PySide2 将 python 信号连接到 QML ui 插槽

Qt c++和Qml信号槽连接