2015-10-15 280 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