为QML

时间:2017-04-29 00:29:56

标签: c++ qt qml

我在QML中创建了一个ListView,我希望能够使用QAbstractListModel作为QML使用的模型来实现类似活动项的东西。更具体地说,我正在使用通用对象模型,如this question的答案中所述。但是,在我的QML代表中,我有类似的东西:

Component
{
    id: itemDlgt

    Rectangle
    {
        id: rec
        width: 50
        height: 50
        color: "#645357"

        property bool itemActive: false

        AbstractItem //AbstractItem is the class that my object model uses. Its only property is a boolean value
        {
            id: s
        }

        MouseArea
        {
            anchors.fill: parent

            onClicked:
            {
                s.status = !s.status
                itemActive= s.status // using this to trigger onItemActiveChanged
                console.log(s.status)
                console.log(index)
            }
        }

        onItemActiveChanged:
        {
            if (itemActive == true)
                rec.color = "#823234"
            else
                rec.color = "#645357"
        }


    }
}

我想要做的是,ListView中只有一个项目一次只能保存一个真值。单击另一个项目后,我想将先前所选项目的AbstractItem设置为false,然后将新项目的AbstractItem设置为true。

当然,我可以使用这样的东西:

ListView 
{
    id: view
    anchors.fill: parent
    clip: true
    model: myAbstractModel
    delegate: itemDlgt
    spacing: 5 
    focus: true //using focus could allow to highlight currently selected item, 
                //by using ListView.isCurrentItem ? "blue": "red"
}

但是这似乎不适用于QAbstractListModel,因为箭头键和点击项目似乎都不会突出显示当前项目。

此外,当我使用 beginResetModel() endResetModel时,我希望再次突出显示该项,以防ListView被迫从c ++端重置自身。 )即可。如果我使用Qt Documentation中描述的QAbstractListModel,我可以通过保存所选项目的索引并将其存储直到选择新项目来轻松实现。换句话说,就像这样:

//somewhere in QAbstractListModel's subclass .h file
int x; // temporary storage for keeping currently selected item

//QAbstractListModel's subclass .cpp file
changeCurrentItem(int index) // function that gets called when user selects an item
{
    //...
    //Checking if x has a value, If not, I simply set the
    //needed item's value to true, and then set x to the value of index.
    //Else do the following...
    m_ItemList.at(x).setToFalse();
    m_ItemList.at(index).setToTrue();
    x = index;
}

但是当我使用它时我遇到了several issues,这就是我决定使用通用对象模型的原因,这似乎更灵活。

最后,我希望能够在当前所选项目发生变化时向代码的c ++端发送信号,这对于MouseArea来说是微不足道的,但我不知道使用ListView&#39这样做的方法。 ; s 焦点属性,应该是一个选项。

简而言之,这就是我的问题:

我是否遗漏了有关QML代码的内容,这可以让我突出显示当前所选项目,同时还可以在重置ListView后保持活动状态,并且能够在c ++发生变化时向c ++发送信号? 如果没有,有没有办法在我的通用对象模型中实现一个函数,它跟踪当前选择的项目,以便我可以突出显示它?

1 个答案:

答案 0 :(得分:0)

如果使用ListView的{​​{1}}属性是goto方法。

只需通过以下方式设置代理中的颜色:

currentIndex

不要忘记,为了使其正常工作,必须设置活动索引,它不能通过魔法工作,默认情况下它将为-1,所以没有项目将突出显示:

color: index == view.currentIndex ? "blue": "red"

同样适用于键盘事件,您必须告诉视图如何处理事件,因此您可以使用向上和向下键增加和减少当前索引。

还有另一种方法,如果您想要从任何视图中分离活动项目功能,并且在项目级别拥有它,则更适用:

//in the delegate mouse area
onClicked: view.currentIndex = index

focus属性仅指定项目是否具有键盘事件焦点。

如果您想要了解索引更改的信号,请使用property ItemType activeItem: null function setActiveItem(item) { if (activeItem) activeItem.active = false activeItem = item activeItem.active = true }