wangshenqiang 2023-04-27 11:21
浏览 15
已结题

QML的ListView如何访问代理内部的function

#情况是想实现一个包含多个相同的复杂子项的界面,在外部需要调用子项的一些函数。原本用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

  • 写回答

1条回答 默认 最新

  • wangshenqiang 2023-04-27 19:49
    关注

    “通过调用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定义在代理的顶层

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月5日
  • 已采纳回答 4月27日
  • 创建了问题 4月27日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数