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();
}
我有一个 QAbstractListModel,它通过
绑定到 QMLengine.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();
}