2014-09-03 4 views
2

Я создал пользовательский тип в моем Qt 5.2 QML приложенияКак использовать настраиваемый тип Qt с сигналом QML?

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

+0

@Nejat У меня нет этого макроса. Но когда я положил Q_DECLARE_METATYPE (Setting) в конце объявления класса, результат будет таким же, как описано в моем вопросе. Итак, ничего не изменилось. – Franz

ответ

2

После того как я очень внимательно прочитанные в документации Qt, я нашел ответ здесь

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

документация говорит

Когда тип объекта QML используется в качестве сигнала параметр, должен использовать var как тип, и значение должно быть получено в C++ с использованием типа QVariant.

Таким образом, определение сигнала в описании QML из Setting должен быть заменен var.

import Setting 1.0 

Button 
{ 
    signal settingChanged(string, var) 

    // ... 
} 

Для подключения сигнала 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*>()); 

    // ... 
} 
Смежные вопросы