首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QProperty将信号和方法传递给.qml页面?

如何使用QProperty将信号和方法传递给.qml页面?
EN

Stack Overflow用户
提问于 2020-07-02 22:56:51
回答 1查看 41关注 0票数 0

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

下面是我的代码之前的样子

basemodel.h

代码语言:javascript
复制
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

代码语言:javascript
复制
BaseModel::BaseModel(QObject *parent)
    : QObject(parent),
      extraModel_(new ExtraModel(this))
{
}

下面是我将.qml页面更改为BaseModel之前的情况

代码语言:javascript
复制
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)
            }
        }
    }
}

这就是我想要的样子(或者类似的东西)

代码语言:javascript
复制
Rectangle {
    signal selectionChanged(int value, string pageTitle, string itemName)
    
    BaseModel {
        id: _baseModel
    }
    
    SilicaListView {
        id: list
        anchors.fill: parent
        model: _baseModel.extra {
            id: _extraModel
            onSelectedChanged: {
                selectionChanged(selected, name, itemName)
            }
        }       
        
        delegate: Rectangle {
            MouseArea {
                anchors.fill: parent
                onClicked: _extraModel.activate(index)
            }
        }
    }
}

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

这就是我尝试使用connection对象的方式

代码语言:javascript
复制
SilicaListView {
    id: _list
    anchors.fill: parent

    model: _baseModel.extra

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-03 00:15:06

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

代码语言:javascript
复制
        model: _baseModel.extra 

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

编辑:要调用可调用的函数,您应该能够这样做:

代码语言:javascript
复制
            MouseArea {
                anchors.fill: parent
                onClicked: _baseModel.extra.activate(index)
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62699222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档