2014-09-03 38 views
2

我創建了一個自定義類型我的Qt 5.2 QML應用如何使用帶有QML信號的自定義Qt類型?

class Setting : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString key READ key WRITE setKey) 
    Q_PROPERTY(QVariant value READ value WRITE setValue) 

public: 
    Setting(QObject * parent = 0); 

    QString key() const; 
    void setKey(QString const & key); 

    QVariant value() const; 
    void setValue(QVariant const & value); 

private: 
    QString m_key; 
    QVariant m_value; 
}; 

內,在我的主要函數註冊它:

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    qmlRegisterType<Setting>("Setting", 1,0, "Setting"); 

    // ... 
} 

在我的應用我想有,有一個按鈕信號與我的自定義類型作爲參數:

import Setting 1.0 

Button 
{ 
    signal settingChanged(string, Setting) 

    // ... 
} 

每當我按下按鈕信號應該發射。

如果我嘗試我的QML信號有我的C++插槽連接

QObject::connect(myButton, SIGNAL(settingChanged(QString, Setting)), this, SLOT(settingChanged(QString, Setting))); 

的Qt說

QObject::connect: No such signal Button_QMLTYPE_41_QML_45::settingChanged(QString, Setting) in ... 

如果我從信號定義中刪除我的自定義類型

Button 
{ 
    signal settingChanged(string) 

    // ... 
} 

和修改連接呼叫

QObject::connect(myButton, SIGNAL(settingChanged(QString)), this, SLOT(settingChanged(QString))); 

連接呼叫工作。

我可以使用我的自定義qml類型在我的應用程序的qml部分內設置。但我做錯了,如果我想用我的信號settingChanged

謝謝!

+0

您是否在類聲明的末尾放置了'Q_DECLARE_METATYPE(Setting)'宏? – Nejat 2014-09-04 04:01:24

+0

@Nejat我沒有定義這個宏。但是當我在我的類聲明結尾處放置Q_DECLARE_METATYPE(Setting)時,結果與我的問題中所述的相同。所以,沒有任何改變。 – Franz 2014-09-04 16:34:08

回答

2

我非常仔細地readed Qt文檔之後,我發現這裏的答案

http://qt-project.org/doc/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#connecting-to-qml-signals

文檔說

當QML對象類型被用作信號參數,參數 應該使用var作爲類型,並且該值應該在C++中接收 使用QVariant類型。

所以,Setting的QML描述內的信號定義必須與var代替。

import Setting 1.0 

Button 
{ 
    signal settingChanged(string, var) 

    // ... 
} 

爲了與C++時隙連接QML信號,代碼必須是

Object::connect(myButton, SIGNAL(settingChanged(QString, QVariant)), this, SLOT(settingChanged(QString, QVariant))); 

在這點的連接工作!

爲了使整個事情運行,QVariant必須被投入到插槽內的正確類型。在我的情況下,一個Setting類型。

void Foo::settingChanged(QString name, QVariant const & var) 
{ 
    Setting * setting = qobject_cast<Setting*>(var.value<QObject*>()); 

    // ... 
}