无法将c ++信号连接到QML中的插槽

时间:2014-11-21 01:29:48

标签: qt qml qt5 qt-signals

大家好我有一个foo课 Foo.h中的代码

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(index)

在我的FooTabView.qml中我有以下代码

     import xxx 1.0
     .....

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

但是现在当我编译和调试时,我没有得到任何错误,但是我在Foo.onFooAdded中的断点永远不会被点击。

我基本上想要的是,当我点击该按钮时,新的foo会被添加到列表中,而我将拥有在Foo.onFooAdded { ... }内创建新标签的逻辑

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

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

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

我想我不知何故必须连接到fooInstance :: onFooAdded而不是Foo :: onFooAdded但是如果我改为fooInstance :: onFooAdded那么我会得到编译错误

先谢谢

3 个答案:

答案 0 :(得分:0)

  

在我的FooTabView.qml中我有以下代码

import xxx 1.0
.....

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

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

fooInstance.fooAdded.connect(someJsFunction)

答案 1 :(得分:0)

¿你能尝试从QML中以这种方式捕捉事件吗?

//QML
fooInstance{
    onFooAdded: {

    }
}

我在Github中有一些代码,有很多可以帮助你的例子,因为QML&lt; - &gt; C ++中的信号和插槽有时候设置起来有些烦人。代码记录在案,但有任何疑问只需要问;)

希望这有帮助!

答案 2 :(得分:0)

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

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