QML 从 QML 或 C++ 更新 Gridview 而不发出 dataChanged

QML Update Gridview from QML or C++ without emit dataChanged

我有一个 QAbstractListModel,它通过

绑定到 QML
engine.rootContext()->setContextProperty

显示在 GridView 中。它包含像 A、Queens 等卡片。我想以不同的方式(如颜色、类型等)对卡片进行排序。可以通过 qml 调用排序功能:

GridView
{
    id:table_player
    model: Playerfield
    delegate: Card
    {
        card_id: model.card_id
        Component.onCompleted:
        {
            Playerfield.sortDeck()
        }
    }
}

C++ 代码:

public slots:
    Q_INVOKABLE void sortDeck();

它有效,但仅在更换卡片/播放新卡片时更新游戏场。我需要一种方法来将“emit dataChanged()”以外的信号发送到 QML 进行更新。或者直接从 QML 使用更改后的模型数据更新 Gridview 的方法(table_player.update() 不起作用)。

void Deckmodel::sortDeck()
{
    for(uint a = 0; a < cards.size(); a++)
    {
        for(uint b = a+1; b < cards.size(); b++)
        {
            if(cards[a].type > cards[b].type)
            {
                Card temp = cards[a];
                cards[a] = cards[b];
                cards[b] = temp;
            }
        }
    }
//insert signal here
}

Deckmodel 与代码中的 Playerfield 是一回事吗?更改模型时,需要调用 begin/endResetModel()。这将自动发出适当的信号,因此您的 QML 应该更新正确。

void Deckmodel::sortDeck()
{
    beginResetModel();

    for(uint a = 0; a < cards.size(); a++)
    {
        for(uint b = a+1; b < cards.size(); b++)
        {
            if(cards[a].type > cards[b].type)
            {
                Card temp = cards[a];
                cards[a] = cards[b];
                cards[b] = temp;
            }
        }
    }

    endResetModel();
}