C++ 如何使用QProperty将信号和方法传递到.qml页面?

C++ 如何使用QProperty将信号和方法传递到.qml页面?,c++,qt,qml,C++,Qt,Qml,最近,我对如何创建带有子模型的简单通用模型并将其数据传递到.qml页面很感兴趣。我得到了帮助并做到了。但现在我有另一个问题。现在我可以使用角色,但不能使用信号或方法 这里是我的代码以前的样子 basemodel.h class BaseModel : public QObject { Q_OBJECT Q_PROPERTY(ExtraModel* extra READ extraModel CONSTANT) public: explicit BaseModel(QOb

最近,我对如何创建带有子模型的简单通用模型并将其数据传递到.qml页面很感兴趣。我得到了帮助并做到了。但现在我有另一个问题。现在我可以使用角色,但不能使用信号或方法

这里是我的代码以前的样子

basemodel.h

class BaseModel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(ExtraModel* extra READ extraModel CONSTANT)

public:
    explicit BaseModel(QObject *parent = nullptr);

    ExtraModel* extraModel() const { return extraModel_; }

private:
    ExtraModel* extraModel_ = nullptr;
};
basemodel.cpp

BaseModel::BaseModel(QObject *parent)
    : QObject(parent),
      extraModel_(new ExtraModel(this))
{
}
下面是我将.qml页面更改为BaseModel之前的情况

Rectangle {
    signal selectionChanged(int value, string pageTitle, string itemName)
    
    SilicaListView {
        id: list
        anchors.fill: parent
        model: ExtraModel {
            id: _extraModel
            onSelectedChanged: {
                selectionChanged(selected, name, itemName)
            }
        }       
        
        delegate: Rectangle {
            MouseArea {
                anchors.fill: parent
                onClicked: _extraModel.activate(index)
            }
        }
    }
}
这就是我想要的(或类似的)

但是_baseModel.extra不能作为组件使用,所以我问如何使用来自_baseModel.extra的信号,并得到了答案:Connections对象。所以,我搜索并找到了连接对象是什么。所以,我尝试过使用它,但我只发现我无法访问来自ExtraModel的信号,或者可能做错了什么

这就是我试图使用连接对象的方式

SilicaListView {
    id: _list
    anchors.fill: parent

    model: _baseModel.extra

    Connections {
        id: _extraModel
        target: _baseModel.extra
        onSelectedChanged: {
            selectionChanged(selected, name, itemName)
        }
    }
    ...
}

因此,问题是如何使用BaseModel从ExtraModel访问我的信号和方法?

要使用
连接
对象连接到信号,您的代码应该如下所示:

        model: _baseModel.extra 

        Connections {
            target: _baseModel.extra
            onSelectedChanged: {
                selectionChanged(selected, name, itemName)
            }
        }  
编辑: 要调用可调用的函数,您应该能够执行以下操作:

            MouseArea {
                anchors.fill: parent
                onClicked: _baseModel.extra.activate(index)
            }

您可以使
extraModel()
方法Q\u可调用,以便能够从QML调用它。事实上,这个属性也应该起作用。您是否注册了您的
ExtraModel
?“你犯了什么错误?”福利比谢谢你的回答。您的意思是在BaseModel中生成extraModel()方法吗?另外,您所说的注册是指qmlRegisterType吗?是的,但创建BaseModel就是这样,不要注册其他模型,只需通过BaseModel放置它们。Connections对象听起来是正确的。“你说你试过了,但实际上你没有告诉我们你试过了什么。”贾曼感谢你的回复。我已附上我如何尝试使用连接。但我觉得我完全错了,但我不确定到底错了什么对不起,我在附加的代码中犯了一个错误。我编辑过。我也试着在你的代码中这样做。但我还有一个鼠标区域,在那里我有代码MouseArea{anchors.fill:parent onClicked:_extra.activate(index)}什么也不起作用。所以,我尝试使用鼠标区域的连接,但我不知道如何访问Q_INVOKABLE activate()方法好的,但这部分工作正常吗?您能处理您的信号吗?是的,控制台不会显示任何错误。事实上,我已经试过了你发给我的每一个代码示例,但我想这就是为什么它不起作用的原因。无论如何,非常感谢你的帮助!现在可以了:)
            MouseArea {
                anchors.fill: parent
                onClicked: _baseModel.extra.activate(index)
            }