{Qml新手(使用Qt 5.1 beta快速2.0)和学习}。
我想知道Qml中是否可以使用这样的成语: 下面我有objLeftColumn,它希望它的子节点暴露一个布尔m_bIsSelected和一个MouseArea别名m_mouseProperty并使用它们使这些子集的集合相互排斥,即,只有其中一个可以处于选中状态。以下工作正常但我需要每次都需要重复它,特别是如果我想要它等行等。
Column {
id: objLeftColumn
property int m_iLastButtonClicked: -1
property int m_iCurrentButtonClicked: -1
onM_iCurrentButtonClickedChanged: {
if(m_iLastButtonClicked != -1) {
objLeftColumn.children[m_iLastButtonClicked].m_bIsSelected = false
}
m_iLastButtonClicked = m_iCurrentButtonClicked
}
Repeater {
id: objLeftColumnRepeater
model: 5
delegate: ABCD {
id: objABCD
m_mouseProperty.onClicked: {
if(m_bIsSelected) {
objLeftColumn.m_iCurrentButtonClicked = index
}
else {
objLeftColumn.m_iLastButtonClicked = -1
objLeftColumn.m_iCurrentButtonClicked = -1
}
}
}
}
}
我可以编写一个通用的objLeftColumn(在一个单独的qml文件中),可以在列中排列给定的项目,同时处理他们选择的排他性吗?
这个想法是代替将组件提供给委托,然后,我将稍后给出它,并为组件的每个实例化(取决于上下模型的数值)委托:在Repeater中应该表现与此类似。
例如,在psedo代码中:
在Exclusive.qml中:
Column {
id: objLeftColumn
property int m_iLastButtonClicked: -1
property int m_iCurrentButtonClicked: -1
property alias m_delegate: objLeftColumnRepeater.delegate
onM_iCurrentButtonClickedChanged: {
if(m_iLastButtonClicked != -1) {
objLeftColumn.children[m_iLastButtonClicked].m_bIsSelected = false
}
m_iLastButtonClicked = m_iCurrentButtonClicked
}
Repeater {
id: objLeftColumnRepeater
model: 5
onItemAdded: {
//state of item can be manipulated but want to
//add behaviour to the item eg:
/*item {
m_mouseProperty.onClicked: {
//do something
}
}*/
}
}
}
Exclusive {
model: 5
delegate: ABCD
}
Exclusive {
model: 9
delegate: DEFG
}
等。通过这种方式,Column in Exclusive更通用,可以使用分配给其委托的任何Item调用,并且行为类似。这在qml
中是否可行答案 0 :(得分:1)
这需要一些诀窍才能解决,我可以想到两种方式:
使用JS connect()函数手动创建连接。像这样:
Repeater {
id: objLeftColumnRepeater
model: 5
onItemAdded: {
item.m_mouseProperty.onClicked.connect(function() {
console.log("Clicked!");
});
}
}
使用Item
将代理人包裹到Loader
,并使用Connections
元素进行连接。像这样:
property Component delegate
Repeater {
id: objLeftColumnRepeater
model: 5
delegate: Item {
Loader {
id: loader
sourceComponent: delegate
}
Connections {
target: loader.item.m_mouseProperty
onClicked: console.log("Clicked")
}
}