一个小问题,我使用QAbstractListModel向QML属性提供数据,前2个字符串属性分配可以,但是当我尝试分配布尔QML属性时,分配失败。 我的代码如下:
ListView
model: MyModel
delegate:
MyItem {
test: MyModel.isRunning //test is the bool property and isRunning is the bool role in MyModel
MouseArea{
anchors.fill: parent
onClicked: {
MyModel.setisRunning(index,boolFlag) //invert MyModel.isRunning
}
}
在MyModel类中,我具有以下相关代码:
void MyModel::setisRunning(int itemIndex, bool isRunning)
{
mItem[itemIndex]->setRunningState(isRunning);
emit dataChanged(index(itemIndex,2), index(itemIndex,2),QVector<int>() << TimerRole);
}
在MyItem类中,我具有以下相关代码:
void MyItem::setRunningState(bool isRunning)
{
if(isRunning!=m_isRunning)
{
m_isRunning = isRunning;
}
}
更改MyModel.isRunning后,我无法反转测试属性的布尔状态,当我将其打印出来时,测试属性始终显示为“ false”。
最令我困惑的是执行TimerModel.setisRunning(index,boolFlag)
,MyModel.isRunning
可以在true / false之间切换,但是测试属性无法相应地更改
我是Qt新手,请帮帮我!谢谢
答案 0 :(得分:0)
我尝试在Cpp数据模型中重新实现setData(),它起作用了。由于我没有重新实现setData(),根据我的理解,cpp中的更改不是在QML中 “已注册” ,这种理解正确吗?>
但是我使用了不带setData()的方法(我以前的方法,仅带有dataChange()信号的方法)来更改cpp中的数据,QML字符串属性可能会相应地更改,我不明白为什么这样做有效? / p>
//change data in cpp
void MyModel::setTime(int itemIndex)
{
mItem[itemIndex]->setTime(QDateTime::currentDateTime());
emit dataChanged(index(itemIndex,0), index(itemIndex,0),QVector<int>() << TimerRole);
}
//in QML
time: Qt.formatTime(model.time, "hh:mm:ss")