如何从C ++代码中的特定QML项的上下文中发出信号

时间:2015-10-15 08:13:02

标签: c++ qt qml

我有两个QML项目具有相同的接口(发出和处理的信号)和不同的objectName属性值:

Text {
    id: the_first_item
    objectName: "the_first_item"

    signal ping();

    onPing: {
        text = "pong! (variant 1)"
    }
}

Text {
    id: the_second_item
    objectName: "the_second_item"

    signal ping();

    onPing: {
        text = "pong! (variant 2)"
    }
}

我想在其中一个项目的上下文中发出ping信号。在QML中我会这样做:

Item {
    onSomething: the_first_item.ping()
}

问题是我想用C ++代码来做。我有一个指针,指向使用QQuickItem方法检索的findChild类的实例和objectName属性的值。

处理从我发现的C ++代码触发的信号的唯一解决方案是定义自己的QObject衍生物,在其体内声明一个信号方法,然后在该类的实例的上下文中调用它:

class SomeLogic : public QObject
{
public signals:
    void ping();

public:
    void doSth() { ping(); }
};

然后,在引擎的根上下文中放置一个指向此类实例的指针,并以下列方式在QML中将处理程序连接到此信号:

Text {
    id: the_first_item
    //objectName: "the_first_item"

    Connections {
        target: the_instance_of_some_logic_property_name
        onPing: {
            text = "pong!"
        }
    }
}

但是如果我理解正确的话,那就不好了,因为如果以同样的方式定义the_second_item,它们都会处理ping发出的the_instance_of_some_logic_property_name信号我想只触发其中一个。

现在,在我编写它时,我认为可能在每个项目中提供一个实用程序函数,然后在其自己的上下文中发出ping信号,如下所示:

Text {
    id: the_first_item
    objectName: "the_first_item"

    signal ping();

    onPing: {
        text = "pong!"
    }

    function emitPing() {
        ping()
    }
}

在一个更简单的情况下,emitPing就足够了(我不必定义信号或处理程序 - 我只会在emitPing函数中设置文本)但如果我正确理解事物, function signal 之间的区别在于函数调用是同步的,而信号是异步的,并且由于某些原因(从QML启动但处理的GUI状态之间的转换)在C ++中)我希望它是异步的。我还想避免在任何地方编写简单的emitPing函数。

问题:有没有办法在ping的上下文中从C ++代码发出the_first_item信号?

1 个答案:

答案 0 :(得分:2)

因为它有助于评论,现在作为回答:

您可以使用Qts MetaObject System发出任何QObject的信号。在这种情况下,要发出ping的{​​{1}}信号,只需拨打the_first_item

有关整个元对象机制的更多信息,请访问:The Meta-Object System