2015-06-17 20 views
1

我想寫一個方法,有兩個參數:Q_PROPERTY名稱(char *)和QObject *相關聯,允許將Q_PROPERTY的通知信號(如果存在)連接到void slot(QVariant),或動態連接到插槽建成這將叫void method(QVariant)。信號的簽名可以根據參數的類型而變化。如何建立一個通用的方法來從不同的Q_PROPERTY類型的notifySignal連接到屬性char * name的void槽(QVariant)?

我該如何在Qt 5中實現?也許這是不可能的,但我不會停止搜索,而我不確定這一點。

所以我覺得我有3個解決方案:

  • 建設動態信號的精確簽名的插槽,從信號名稱,並在它調用一個方法(的QVariant),使用舊的Qt使用全新的Qt 5連接系統

    connect(sender, SIGNAL (valueChanged(QString,QString)), 
        receiver, SLOT (updateValue(QString))); 
    
  • connect(sender, &Sender::valueChanged,receiver, &Receiver::updateValue); 
    
  • 連接方式

    構建可與QVariant一起使用的所有槽簽名。

Althougt,我不知道如何動態構建一個槽,爲第一個解決方案調用指定的方法;對於第二種解決方案,我不知道如何從notifySignal的QMetaMethod中檢索函數指針;也許最後的解決方案是最好的方式,並且容易實現,但它有點極端。

您對此有何看法?

回答

0

對於「動態構建插槽」,Qt中有私有API(查找QMetaObjectBuilder或類似的類)。但是這並不能解決連接問題。

請注意,QObject::connect過載,將QMetaMethod作爲信號和插槽。所以,你可以輕鬆地構建一個「接收器」類對象(記住它作用於哪個屬性的唯一目的):

class Receiver : public QObject { 
    Q_OBJECT 
public: 
    explicit Receiver(const char *property, QObject *parent = 0) 
     : QObject(parent), 
     m_property(property) 
    {} 

signals: 
    void propertyChangedForObject(const char *property, QObject *object); 
public slots: 
    void onPropertyChanged() { 
     emit propertyChangedForObject(m_property, sender()); 
    } 
private: 
    const char * const m_property; 
}; 

而且在你的方法把它掛起來。

相關問題