Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QML如何从委托调用模型的方法_Qt_Qml - Fatal编程技术网

Qt QML如何从委托调用模型的方法

Qt QML如何从委托调用模型的方法,qt,qml,Qt,Qml,我有一个简单的QML程序,它有一个ListView。ListView的模型和委托在单独的QML文件中定义 //Main.qml 导入QtQuick 2.12 导入QtQuick.Window 2.12 导入QtQuick.Controls 2.12 //导入model.qml //导入delegate.qml 窗口{ id:窗口 可见:正确 宽度:640 身高:480 标题:qsTr(“你好世界”) 列表视图{ 锚定。填充:父级 型号:theModel 代表:德尔盖特 焦点:正确 } 钮扣{ x

我有一个简单的QML程序,它有一个
ListView
。ListView的模型和委托在单独的QML文件中定义

//Main.qml
导入QtQuick 2.12
导入QtQuick.Window 2.12
导入QtQuick.Controls 2.12
//导入model.qml
//导入delegate.qml
窗口{
id:窗口
可见:正确
宽度:640
身高:480
标题:qsTr(“你好世界”)
列表视图{
锚定。填充:父级
型号:theModel
代表:德尔盖特
焦点:正确
}
钮扣{
x:394
y:257
文字:“按我”
onPressed:theModel.append({“color”:“black”,“cost”:5.95,“name”:“Pizza”})
}
德尔盖特{
id:theDelegate
}
模型{
id:模型
}
}
然后是模型文件

//model.qml
导入QtQuick 2.0
列表模型{
李斯特伦{
颜色:“红色”;
姓名:“比尔·史密斯”
编号:“5553264”
}
李斯特伦{
颜色:“蓝色”;
姓名:“约翰·布朗”
电话号码:“5558426”
}
李斯特伦{
颜色:“绿色”;
姓名:“山姆·怀斯”
电话号码:“5550473”
}
}
最后是代表

//TheDelegate.qml
导入QtQuick 2.0
组成部分{
长方形{
颜色:model.color
宽度:100
身高:100
鼠耳{
锚定。填充:父级
onPressed:model.append({“color”:“black”,“cost”:5.95,“name”:“Pizza”})
}
}
}
如果我单击代理的
MouseArea
onPressed
方法将需要创建一个
列表项
,但问题是我无法从代理访问模型的功能。但令人困惑的是,在委托中通过
model
访问属性。
有人能指出正确的方法吗?比如说,如果我知道该模型是一个
列表模型
,并且它有
append
方法,但委托人不知道,有没有一种方法可以将模型强制转换为已知类型,然后调用它的方法?

这可以通过向delegate添加一个信号来实现,您可以在模型可用的范围内连接。我想称之为“包含的组件”,可能有一些花哨的术语;-)

请将delegate.qml更改为(顺便说一句,为了可重用性,我还将其更改为非
组件
):

然后在
main.qml
中,您可以按如下方式使用它:

ListView {
    anchors.fill: parent
    model: theModel
    delegate: theDelegate

    focus: true
}

Component {
    id: theDelegate

    TheDelegate {
        onAppendRequested: theModel.append(newItem)
    }
}

模型对象向视图中的每个委托公开,并为该特定委托提供模型数据。它与ListView的模型属性不同

@Amfasis的方法很好,因为它可以处理任何类型的模型和视图

如果不介意将委托绑定到ListView,可以使用附带的ListView API:

Component {
    Rectangle{
        id: root
        color: model.color
        width: 100
        height: 100
        MouseArea{
            anchors.fill: parent
            onPressed: root.ListView.view.model.append({"color":"black", "cost": 5.95, "name":"Pizza"})
        }
    }
}

我明白了,就像是晚装订。因为委托本身是有效的,但在视图中使用时,视图只知道谁是模型。但这里突然出现了一个问题。为什么行“color:model.color”起作用?您是否假设上述组件与ListView位于同一个qml文件中?因为是我将在按下时更改:root。。。。。那么根就是组件本身。如果是这样的话,那么我知道模型就没有问题了,因为它可以从ListView的id属性访问。
Component {
    Rectangle{
        id: root
        color: model.color
        width: 100
        height: 100
        MouseArea{
            anchors.fill: parent
            onPressed: root.ListView.view.model.append({"color":"black", "cost": 5.95, "name":"Pizza"})
        }
    }
}