2015-10-15 73 views
1

特定QML项目的上下文中发射信号I有两个QML项具有相同接口(信号发射和处理)和不同objectName属性值:如何在从C++代码

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信号,我只想触发其中的一个。

现在,当我写它,我认为,在每个项目可能提供一个效用函数,然后在自己的上下文发出ping信号,这样的:

Text { 
    id: the_first_item 
    objectName: "the_first_item" 

    signal ping(); 

    onPing: { 
     text = "pong!" 
    } 

    function emitPing() { 
     ping() 
    } 
} 

在simplier情况下, emitPing就足够了(我不需要定义信号和处理程序 - 我只需在emitPing函数中设置文本),但如果我理解正确,函数信号之间的区别在于函数当信号异步时,调用是同步的nd由于某些原因(从QML启动但用C++处理的GUI状态之间的转换)我希望它是异步的。我也想避免必须在任何地方写出无所不能的emitPing函数。

问题:有一种方法以发射ping信号,从C++代码,在仅仅the_first_item上下文?

回答

2

因为它有助于为注释,现在作为的answere:

可以使用QTS元对象系统发出任何的QObject的信号。在这种情况下,发出的the_first_itemping信号,只需调用对整个元对象机制QMetaObject::invokeMethod(the_first_item, "ping");

更多信息可以在这里找到:The Meta-Object System

+0

非常感谢您的帮助:) –

+0

这就是为什么我在这里:D – Felix