Qt QML ListView可见

标签 qt qml visibility qtquick2

我在 QML 示例中找到了以下代码。我有一个关于节的问题:当用户点击节标题时,有没有办法隐藏属于节的所有元素?例如,是否可以在用户点击“Tiny”标题时隐藏“Ant”和“Flea”?

代码如下:

Rectangle {
    id: container
    width: 300
    height: 360

    ListModel {
        id: animalsModel
        ListElement { name: "Ant"; size: "Tiny" }
        ListElement { name: "Flea"; size: "Tiny" }
        ListElement { name: "Parrot"; size: "Small" }
        ListElement { name: "Guinea pig"; size: "Small" }
        ListElement { name: "Rat"; size: "Small" }
        ListElement { name: "Butterfly"; size: "Small" }
        ListElement { name: "Dog"; size: "Medium" }
        ListElement { name: "Cat"; size: "Medium" }
        ListElement { name: "Pony"; size: "Medium" }
        ListElement { name: "Koala"; size: "Medium" }
        ListElement { name: "Horse"; size: "Large" }
        ListElement { name: "Tiger"; size: "Large" }
        ListElement { name: "Giraffe"; size: "Large" }
        ListElement { name: "Elephant"; size: "Huge" }
        ListElement { name: "Whale"; size: "Huge" }
    }

    // The delegate for each section header
    Component {
        id: sectionHeading
        Rectangle {
            id: sectionHeadingRectangle
            width: container.width
            height: childrenRect.height
            color: "lightsteelblue"

            Text {
                text: section
                font.bold: true
                font.pixelSize: 20;
            }
        }
    }

    Component {
        id: section
        Rectangle {
            width: container.width
            height: mainText.height

            Text { id: mainText; text: name; font.pixelSize: 18 }
        }
    }

    ListView {
        id: view
        anchors.fill: parent
        // width: parent.width
        model: animalsModel
        delegate: section

        section.property: "size"
        section.criteria: ViewSection.FullString
        section.delegate: sectionHeading
    }
}

最佳答案

可以通过在单击某个部分时发送自定义信号并让所有代表连接到此信号并检查单击的部分是否与其相应的部分相对应并相应地隐藏来实现此目的:

Rectangle {
    id: container
    width: 300
    height: 360

    ListModel {
        id: animalsModel
        ListElement { name: "Ant"; size: "Tiny" }
        ListElement { name: "Flea"; size: "Tiny" }
        ListElement { name: "Parrot"; size: "Small" }
        ListElement { name: "Guinea pig"; size: "Small" }
        ListElement { name: "Rat"; size: "Small" }
        ListElement { name: "Butterfly"; size: "Small" }
        ListElement { name: "Dog"; size: "Medium" }
        ListElement { name: "Cat"; size: "Medium" }
        ListElement { name: "Pony"; size: "Medium" }
        ListElement { name: "Koala"; size: "Medium" }
        ListElement { name: "Horse"; size: "Large" }
        ListElement { name: "Tiger"; size: "Large" }
        ListElement { name: "Giraffe"; size: "Large" }
        ListElement { name: "Elephant"; size: "Huge" }
        ListElement { name: "Whale"; size: "Huge" }
    }

    // The delegate for each section header
    Component {
        id: sectionHeading
        Rectangle {
            id: sectionHeadingRectangle
            width: container.width
            height: childrenRect.height
            color: "lightsteelblue"

            Text {
                text: section
                font.bold: true
                font.pixelSize: 20;
            }
            MouseArea {
                anchors.fill: parent
                onClicked: view.sectionClicked(section)
            }
        }
    }

    Component {
        id: section
        Rectangle {
            id: rect
            width: container.width
            height: shown ? mainText.height : 0
            visible: shown
            property bool shown: true

            Text { id: mainText; text: name; font.pixelSize: 18 }
            Connections {
                target: rect.ListView.view
                onSectionClicked: if (rect.ListView.section === name) shown = !shown;
            }
        }
    }

    ListView {
        id: view
        anchors.fill: parent
        // width: parent.width
        signal sectionClicked(string name)
        model: animalsModel
        delegate: section
        section.property: "size"
        section.criteria: ViewSection.FullString
        section.delegate: sectionHeading
    }
}

关于Qt QML ListView可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29647291/

相关文章:

c++ - 一个端口 c++ 如何连接到互联网?

Java,编译错误,构造函数

android - 更改 listView 的可见性

c++ - 来自选定行的 Qt C++ 数据

c++ - 在 mac 上执行 .app 时,fstream 和 qfile 不创建文件

qt - Qml Module not found CPP Class registration with new QML_ELEMENT r

qt - 在 qml 中自动调整文本大小

shared-libraries - 修改已编译共享库中符号的可见性

c++ - 与第 3 方库链接导致 openssl 中出现段错误

javascript - QML 鼠标在 MouseArea 中的绝对位置