2

我正在使用 QtQuick 2.0 和 QML ListView 来显示一些项目,我需要知道用户何时选择了不同的项目。当用户单击委托中的鼠标区域时发出信号,即

MouseArea{
    onClicked: {
                 controller.itemChanged(model.item);
                 someList.currentIndex = index;
   }
}

但仅当用户使用鼠标选择项目时,如果用户使用箭头键则不起作用。

我一直在查看文档以查找currentIndex更改时发出的信号,但我似乎找不到任何信号。我正在寻找类似的东西,QListWidget::itemSelectionChanged()但似乎 QML ListView 没有。

4

3 回答 3

2

你只需要onCurrentItemChanged:{}在你的ListView.

于 2015-09-04T11:08:23.397 回答
0

我最终不得不重新实现键盘行为并从委托中公开模型数据,以便在按下键时触发信号。

ListView {
    id: myList
    focus: true
    orientation: "Horizontal" //This is a horizontal list
    signal itemChanged(var item)
    interactive: false //Disable interactive so we can re-implement key behaviour
    Keys.onPressed: {
                if (event.key == Qt.Key_Left){
                    myList.decrementCurrentIndex(); //Change the current list selection
                    itemChanged(myList.currentItem.selectedItem.data); //Fire signal notifying that the selectedItem has changed
                }
                else if (event.key == Qt.Key_Right){
                    myList.incrementCurrentIndex(); //Change the current list selection
                    itemChanged(myList.currentItem.selectedItem.data); //Fire signal notifying that the selectedItem has changed
                }
            }

    delegate: Component {
        Rectangle {
            id: myItem
            property variant selectedItem: model //expose the model object

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    myList.currentIndex = index; //Change the current selected item to the clicked item
                    itemChanged(model.data); //Fire signal notifying that the selectedItem has changed
                }
            }
        }
    }
}

使用此解决方案,您必须在用户单击项目或按键时手动更改 QML 中的项目。我不确定这是否是最佳解决方案,GridView但它适用于ListView.

于 2014-04-07T02:55:09.147 回答
0

看到这个问题。您可以采取两种方法

  1. 连接到另一个组件的事件
  2. 处理该组件内的事件

信号处理程序on<SignalName>以大写信号的第一个字母命名。

于 2014-09-09T03:24:35.760 回答