2017-02-03 96 views
0

Qt的元對象系統允許進行很多有趣的反思。但我的問題如下:假設我編碼了class MyClass : public QObject。我想在我的GUI中有一個按鈕來創建MyClass的實例。但我決定創建MySubClass : public MyClass,然後創建另一個按鈕來創建MySubClass的實例。Qt:如何獲得特定類的兒童的所有類

現在,一位同事也創建了自己的子類。有沒有辦法自動找出所有擴展MyClass的類(並自動添加相關按鈕)?

我可以看到一些解決方法一樣具有MetaObject陣列,使得我可以叫他們每個人的QMetaObject::newInstance(),但它需要我手動添加子,每次一個新sublass被添加到代碼庫。

有沒有一種自動的方式來做到這一點?如果需要,我可以將自己限制在實現特定Q_INTERFACE的類中,如果它有任何區別的話。

+0

我問這個問題,因爲我知道我可以在Java中做到這一點 – Fezvez

回答

1

不,沒有自動的方法去做,因爲這些類沒有在任何地方註冊 - Q_OBJECT宏只會將成員直接添加到類中,但不會註冊該類。

你可以做的是增加一個項目範圍定義修改Q_OBJECT通過成員加入工廠登錄,例如:

// this declaration added to `Q_OBJECT`: 
Factory::Registration q_obj_reg{this}; 

考慮:

class Factory { 
public: 
    class Registration { 
    public: 
    template <typename T> Registration(T*); 
    ... 
    }; 

};

這會自動註冊至少第一次使用的所有QObject類。

+0

我即將被說服,但那麼QMetaObject :: newInstance()如何在沒有註冊的情況下工作? – Fezvez

+0

我發現確實沒有魔法,這就是爲什麼我不得不使用qRegisterMetaType()。所以你確實是對的,我確信 – Fezvez