2014-11-21 54 views
0
连接到插槽

大家好我的主要有Foo类 代码foo.h中无法对C++的信号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.onFooAdded { ... }

有人可以告诉我,我错过了什么或做错了,我如何将fooAdded(index)信号连接到QML中的onFooAdded。

请注意,我也尝试了下面的代码也在里面FooTabView.xml但是我的断点没有被击中

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

我想我无论如何都必须连接到fooInstance :: onFooAdded而不是foo :: onFooAdded,但我得到,如果我改变fooInstance编译错误::提前

回答

0

onFooAdded

感谢在我FooTabView.qml我有下面的代码

import xxx 1.0 
..... 

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

这部分看起来像使用附加信号,不像对象的信号。尝试通过此类呼叫建立连接:

fooInstance.fooAdded.connect(someJsFunction) 
+0

据我所知,当插槽接收器被破坏时,您需要调用'fooInstance.fooAdded.disconnect(...)'。 – tonytony 2014-11-29 10:46:39

0

¿您可以尝试从QML以这种方式捕获事件吗?

//QML 
fooInstance{ 
    onFooAdded: { 

    } 
} 

我在Github的一些代码有大量的例子,也许可以帮助你,因为QML <信号和槽 - > C++有时有点恼人成立。该代码被记录,但有任何疑问就问;)

希望这有助于!

0

使用Connections是连接上下文属性的插槽的正确方法。我创建了一个类似于你的测试项目,一切正常。

我不完全信任QML断点,因此我建议您使用console.log("...")语句来检查槽是否被调用。