เหตุใดการเพิ่ม MouseArea ด้วย anchors.fill: parent ทำให้แถวซ้อนกัน

เนื่องจากสิ่งนี้ ListView ทำงานได้ดี:

ListView {
    id: myListView
    model: myListModel
    anchors.fill: parent

    delegate: Row {
        id: row
        spacing: 5
        Text {
            text: id
            width: 25
            horizontalAlignment: Text.AlignHCenter
        }

        Text {
            text: description
        }
    }
}

เหตุใดการเพิ่ม MouseArea ด้วย anchors.fill: parent ทำให้แถวซ้อนกัน ฉันจะคืนระยะห่างแนวตั้งอัตโนมัติที่ฉันมีก่อนที่จะเพิ่ม MouseArea ได้อย่างไร ฉันได้ลองใส่ Row ใน Rectangle และใน Component แล้ว

ListView {
    id: myListView
    model: myListModel
    anchors.fill: parent

    delegate: Row {
        MouseArea {
            anchors.fill: parent
            onClicked: myListView.currentIndex = index
        }
        id: row
        spacing: 5

        Text {
            text: id
            width: 25
            horizontalAlignment: Text.AlignHCenter
        }

        Text {
            text: description
        }
    }
}

qml
person Nathaniel Johnson    schedule 13.02.2015    source แหล่งที่มา


คำตอบ (1)


รายการซ้อนกันด้วยเหตุผลง่ายๆ: ความสูงของรายการ ไม่ได้ตั้งค่า ผู้รับมอบสิทธิ์จะต้องเสมอตั้งค่าความสูงไว้ เนื่องจากคุณไม่ได้ระบุค่าใดค่าหนึ่ง ความสูงของผู้รับมอบสิทธิ์จึงเป็นศูนย์ และข้อความที่ล้อมรอบจะแสดงผลบน y (ศูนย์) เดียวกัน โดยเรียงซ้อนกัน

อย่างไรก็ตาม นั่นไม่ใช่ปัญหาเดียวที่นี่ คุณกำหนด MouseArea ที่จะยึด Rows และ Columns บังคับการจัดเรียงเฉพาะสำหรับรายการภายในตัวมันเอง การเพิ่มพุกอาจรบกวนการทำงานของกลไกอัตโนมัตินี้ได้ นอกจากนี้ เอกสารก็มีความชัดเจนเกี่ยวกับเรื่องนี้ คุณสามารถอ่านได้ว่า...

Row คือประเภทที่วางตำแหน่งรายการย่อยในแถวเดียว สามารถใช้เป็นวิธีที่สะดวกในการจัดตำแหน่งชุดรายการในแนวนอนโดยไม่ต้องใช้พุก

...และนั่นก็เช่นกัน...

[...]เนื่องจาก Row จะวางตำแหน่งลูกในแนวนอนโดยอัตโนมัติ รายการลูก ภายในแถว ไม่ควรตั้งค่า โดย x< /strong> ตำแหน่งหรือ จุดยึด ในแนวนอนโดยใช้จุดยึด ซ้าย, ขวา ศูนย์กลางแนวนอน, เติม หรือจุดยึดตรงกลาง

อาจเป็นไปได้ว่าข้อผิดพลาดในการยึดทำให้เกิดสถานะที่ไม่สอดคล้องกัน โดยที่ Row จะไม่สืบทอดความสูงจากข้อความที่ล้อมรอบ เช่นเดียวกับที่ทำโดยไม่มีการยึดรายการ ซึ่งส่งผลให้มีความสูงเป็นศูนย์และการเรียงซ้อน

ในกรณีนี้ คุณสามารถรวม Row ไว้ใน Item และใช้การเติม MouseArea ที่ส่วนหลังได้ โค้ดผลลัพธ์ โดยตั้งค่าความสูงและความกว้างของผู้รับมอบสิทธิ์อย่างถูกต้อง จะมีลักษณะคล้ายกับโค้ดต่อไปนี้ (โปรดทราบ ฉันได้ลบบทบาทและโมเดลในโค้ดของคุณแล้วเนื่องจากส่วนหลังไม่มีอยู่ในโค้ดที่ให้มา ข้อมูลโค้ด):

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.2

ApplicationWindow {
    visible:  true
    width: 200
    height: 300
    
    ListView {
        id: myListView
        model: 20
        anchors.fill: parent
        
        delegate: Item {
            width: myListView.width
            height: text1.height            // set the height!
            Row {
                id: row
                anchors.fill: parent
                spacing: 5
                
                Text {
                    id: text1
                    text: "id"
                    width: 25
                    horizontalAlignment: Text.AlignHCenter
                }
                
                Text {
                    text: "description"
                }
                
            }
            MouseArea {                     // fills the delegate Item, not the Row!
                anchors.fill: parent
                onClicked: {
                    myListView.currentIndex = index
                    console.info("Area clicked! Index: " + index)
                }
            }
        }
    }
}
person BaCaRoZzo    schedule 13.02.2015