我的QML ListView
在我用鼠标扰动它之前不显示我的数据(例如只是向上和向下拖动它。)之后视图显示模型没有问题,直到它会清空,然后我再一次需要扰乱它才能让它再次运转。有没有办法让这个ListView
投入使用?
我在Linux 14.04上使用Qt 5.8。我的模型是QAbstractListModel
的子类。我按照AbstractItemModel Example建立它。主要区别在于我的列表模型是实体的属性,而不是在setContextProperty
中使用main.cpp
设置。
关于ListView
没有更新的问题,这里有一些类似的问题,但似乎一开始只有一个问题。其中大多数与OP手动调用dataChanged
而不是beforeInsertRows()
& endInsertRows()
- 我正在调用的两种方法(见下文)。
我的ListView
位于加载SceneLoader
的项目中。
我posted all the relevant code here,因为我对我在ListView
上如何使用布局有点怀疑(也许这会导致它?也许我的等级被打破了?我无法证明虽然。)
简而言之,
的ListView :
ListView {
anchors.fill: parent
model: sceneGraph.blobs
delegate: delegate
}
BlobModel.cpp :
auto BlobModel::addBlob(const BlobPointDataPtr& data) -> void
{
// ...
// Each blob has a uuid
const auto idx = Contains(uuid);
if (-1 != idx)
{
blobs_[idx]->Update(data);
Q_EMIT dataChanged(createIndex(idx, 0), createIndex(idx, 0));
}
else
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
blobs_ << new Blob{data, id_count_}; id_count_++;
endInsertRows(); // responsible for the QQmlChangeSet
Q_EMIT dataChanged(createIndex(rowCount(), 0), createIndex(rowCount(), 0));
}
}
另外,在我的终端上,我收到了消息:
QObject::connect: Cannot queue arguments of type 'QQmlChangeSet'
(Make sure 'QQmlChangeSet' is registered using qRegisterMetaType().)
这似乎是由endInsertRows()
发出的,但我不确定为什么。在过去,解决方案是注册缺少的类型,例如 qRegisterMetaType<QQmlChangeSet*>("QQmlChangeSet");
但这似乎不是Qt的公共类型,并且因为一切都在没有它的情况下工作,我不是确实错过了确切的问题。
答案 0 :(得分:0)
正如评论中指出的那样,问题是我在主线程之外修改我的模型。
我的代码已设置好,以便另一个线程通过直接调用addData
来触发我的模型的添加。我的最小示例无法复制的原因是因为在其中我使用QTimer
来模拟其他线程,但QTimer
也在主线程上运行。
解决方案是将我的直接调用更改为addData(data)
以发出信号以进行添加,从而将实际工作移回主线程。