2014-09-03 37 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*>()); 

    // ... 
}