#情况是想实现一个包含多个相同的复杂子项的界面,在外部需要调用子项的一些函数。原本用Column是可以直接用children访问到代理内部的函数,但Column不支持中见插入和删除,所以改用ListView进行替换,但是却发现ListModel无法访问代理的内部函数,想过通过调用C++发送信号到内部子项,但是却发现内部子项接收不到C++的信号;又尝试通过ListView访问ContainItem,但是还是失败了(这条路可能能行,但我没走通),所以发出来,希望有人看到能解答一下,万分感谢!
#QML的ListView访问代理项内部的function时报错
精简代码
import QtQuick 2.14
Item {
ListModel {
id: myModel
}
ListView {
id: view
width: parent.width
height: parent.height - btn.height
anchors.left: parent.left
anchors.top: parent.top
interactive: false
model: myModel
delegate: myDeletgate
}
Component {
id: myDeletgate
Item {
width: view.width
height: 30
Text {
anchors.left: parent.left
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
verticalAlignment: Text.AlignVCenter
text: name
}
function doSomeThing() {
console.log("doSomeThing !!!!!!!!!!!!!!!!!!!!!!!");
}
}
}
Rectangle {
id: btn
width: parent.width
height: 30
anchors.left: parent.left
anchors.bottom: parent.bottom
color: "blue"
MouseArea {
anchors.fill: parent
onClicked: {
console.log("",myModel.get(1).name);//访问
myModel.get(1).name = "666666666666666666666666666";
console.log("",myModel.get(1).name);//修改
myModel.insert(1, {name: qsTr("777777777777777777777777777")});//插入
myModel.remove(2);//删除
myModel.get(1).doSomeThing();//调用方法
}
}
}
Component.onCompleted: {
myModel.append({name: qsTr("111111111111111111111111111")});//追加
myModel.append({name: qsTr("222222222222222222222222222")});
}
}
点下按钮后的提示
qml: 222222222222222222222222222
qml: 666666666666666666666666666
qrc:/MyList.qml:50: TypeError: Property 'doSomeThing' of object QObject(0x5483130) is not a function
“通过调用C++发送信号到内部子项,但是却发现内部子项接收不到C++的信号;” 解决办法:把接收信号的地方放到顶层(Component定义的Item内)即可接收到,如果像我之前已经封装过的文件内(Component直接包含的UserItem文件)是无法接收到C++发送的信号的。
delegate: Component {
UserItem {
width: view.width
height: 30
property variant mymodel: model
Text {
anchors.left: parent.left
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
verticalAlignment: Text.AlignVCenter
text: name
}
MouseArea {
anchors.fill: parent
onClicked: {
parent.ListView.view.currentIndex = index
}
}
Connections {
target: btn_mouse
onClicked: {
doSomeThing();
}
}
}
}
doSomeThing();定义在UserItem内,这样也可以接收信号,前提是像府上的这段代码把Connections定义在代理的顶层