Qt 是否可以使Qml中的Repeater委托以通用方式对给定项进行操作?
{Qml(使用Qt5.1beta的Quick2.0)和学习的新手} 我想知道这样的习惯用法在Qml中是否可行: 下面我有一个objLeftColumn,它希望它的子对象公开一个布尔m_biselected和一个MouseArea别名m_mouseProperty,并使用它们使这些子对象的集合相互排斥,即,只有一个子对象可以处于selected状态。下面的工作很好,但我需要重复它,每次我想,特别是如果我想它的行等Qt 是否可以使Qml中的Repeater委托以通用方式对给定项进行操作?,qt,qml,qt-quick,Qt,Qml,Qt Quick,{Qml(使用Qt5.1beta的Quick2.0)和学习的新手} 我想知道这样的习惯用法在Qml中是否可行: 下面我有一个objLeftColumn,它希望它的子对象公开一个布尔m_biselected和一个MouseArea别名m_mouseProperty,并使用它们使这些子对象的集合相互排斥,即,只有一个子对象可以处于selected状态。下面的工作很好,但我需要重复它,每次我想,特别是如果我想它的行等 Column { id: objLeftColumn
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文件中),它可以在列中安排给定的项,同时处理它们选择的排他性
这样做的目的不是将组件直接交给代理,我稍后会给出,对于组件的每个实例化(取决于上面和下面模型的数值),代理:in 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
}
}*/
}
}
}
在SomeOther.qml中:
Exclusive {
model: 5
delegate: ABCD
}
Exclusive {
model: 9
delegate: DEFG
}
因此,排他中的这个列更通用,可以使用分配给其委托的任何项调用,其行为类似。这在qml中是否可能?这需要一些技巧才能解决,我可以想出两种方法:
Repeater {
id: objLeftColumnRepeater
model: 5
onItemAdded: {
item.m_mouseProperty.onClicked.connect(function() {
console.log("Clicked!");
});
}
}
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")
}
}
加载器
将代理包装到项
中,并使用元素进行连接。大概是这样的:
Repeater {
id: objLeftColumnRepeater
model: 5
onItemAdded: {
item.m_mouseProperty.onClicked.connect(function() {
console.log("Clicked!");
});
}
}
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")
}
}
这需要一些技巧才能解决,我可以想出两种方法:
Repeater {
id: objLeftColumnRepeater
model: 5
onItemAdded: {
item.m_mouseProperty.onClicked.connect(function() {
console.log("Clicked!");
});
}
}
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")
}
}
加载器
将代理包装到项
中,并使用元素进行连接。大概是这样的:
Repeater {
id: objLeftColumnRepeater
model: 5
onItemAdded: {
item.m_mouseProperty.onClicked.connect(function() {
console.log("Clicked!");
});
}
}
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")
}
}