我有两个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
信号?
答案 0 :(得分:2)
因为它有助于评论,现在作为回答:
您可以使用Qts MetaObject System发出任何QObject的信号。在这种情况下,要发出ping
的{{1}}信号,只需拨打the_first_item
有关整个元对象机制的更多信息,请访问:The Meta-Object System。