C++ 如何使用QProperty将信号和方法传递到.qml页面?
最近,我对如何创建带有子模型的简单通用模型并将其数据传递到.qml页面很感兴趣。我得到了帮助并做到了。但现在我有另一个问题。现在我可以使用角色,但不能使用信号或方法 这里是我的代码以前的样子 basemodel.hC++ 如何使用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
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)
}