2014-11-21 5 views
0

Привет всем У меня есть класс Foo код в foo.hне в состоянии соединить кесарево сигнал ++ к слоту в QML

Class Foo : public QObject 
{ 
    static Foo* Get(); // Singleton Pattern 

    Q_INVOKABLE int addFoo(); 

signals: 
    void fooAdded(int index); 

public slots: 

private: 
    QList<QString> m_fooArray; 
} 

кодекса foo.cpp

int Foo::addFoo() 
{ 
    QString newString = "blah.." 
    m_fooArray.append(newString); 

    emit fooAdded(m_fooArray.size()-1); 

    return m_fooArray.size()-1; 
} 

в моей основной код функции

{ 
    Foo fooInstance; 
    qmlRegisterType<GUI::Foo>("xxx", 1, 0, "Foo"); 
    engine.rootContext()->setContextProperty("fooInstance", &fooInstance); 
} 

Теперь у меня есть два XML main.xml и fooTabView.qml

в main.xml код

import QtQuick 2.3 
import QtQuick.Controls 1.2 
import xxx 1.0 

ApplicationWindow { 
    id: appWindow 
    visible: true 
    width: 640 
    height: 480 

    FooTabView { 
     anchors.left: parent.left 
     anchors.top: parent.top 
     anchors.margins: 50 
    } 

    Button { 
     id: addFoo 
     x: 50 
     y: 59 
     text: qsTr("Add Connection") 
     onPressedChanged: fooInstance.addFoo(); 
    } 
} 

Теперь, когда я компиляции и отладки, когда я нажимаю на кнопку addFoo моя точка останова в addFoo() функция получает удар, и сигнал fooAdded (индекс) испускается

и в моем FooTabView.qml у меня есть код, приведенный ниже

 import xxx 1.0 
    ..... 

    ..... 
    Foo.onFooAdded: 
    { 
    ..... 
    } 

Но теперь, когда я компиляции и отладки я не получаю ошибку, но моя точка останова внутри Foo.onFooAdded никогда не получить хитов.

Что я в принципе хочу, что, когда я попал на эту кнопку новый Foo добавляются в список и чем я буду иметь свою логику, чтобы создать новую вкладку внутри Foo.onFooAdded { ... }

Может кто-то пожалуйста, скажите мне, что я не хватает или делать неправильно, и как я могу подключить сигнал fooAdded (index) к onFooAdded внутри QML.

Обратите внимание, я также попытался код ниже и внутри FooTabView.xml, но до сих пор моя точка останова не попал

Connections { 
    target: fooInstance 
    onFooAdded: { 
    ... 
    } 
} 

Я думаю, что я как-то подключиться к fooInstance :: onFooAdded и не Foo :: onFooAdded, но я получаю ошибку компиляции, если я перейти к fooInstance :: onFooAdded

заранее спасибо

ответ

0

и в моем FooTabView.qml у меня есть код ниже

import xxx 1.0 
..... 

..... 
Foo.onFooAdded: 
{ 
..... 
} 

Эта часть выглядит использование прикрепленного сигнала, а не как сигнал объекта. Попытайтесь установить соединение по такому вызову:

fooInstance.fooAdded.connect(someJsFunction) 
+0

Насколько я знаю, вам нужно вызвать 'fooInstance.fooAdded.disconnect (...)', когда слот-ресивер будет уничтожен. – tonytony

0

¿Могли бы вы попытаться поймать события таким образом из QML?

//QML 
fooInstance{ 
    onFooAdded: { 

    } 
} 

У меня есть некоторый код в Github с большим количеством примеров, которые, возможно, могут помочь вам, потому что сигналы и слоты от QML < -> C++ иногда немного раздражает, чтобы настроить. Код документирована, но какие-либо сомнения просто спросить;)

Надеется, что это помогает!

0

Использование Connections - это правильный способ подключения к слотам свойств контекста. Я создал тестовый проект, похожий на ваш, и все работает отлично.

Я не полностью доверяю точкам останова QML, поэтому предлагаю вам использовать инструкцию console.log("..."), чтобы проверить, вызван ли звонок или нет.