我的 QML ListView
不显示我的数据,直到我用鼠标扰动它(例如 只需上下拖动它。)在此之后, View 显示模型没有问题,直到它清空,然后我再次需要扰乱它让它再次工作。有没有办法踢这个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 的公共(public)类型,并且因为没有它大多数情况下都可以正常工作,所以我不确定是否遗漏了这个问题。
最佳答案
正如评论中指出的那样,问题是我在主线程之外修改我的模型。
我的代码是这样设置的,以便另一个线程可以通过直接调用 addData
来触发对我的模型的添加。我的最小示例无法复制它的原因是因为在其中我使用了 QTimer
来模拟另一个线程,但是 QTimer
也在主线程上运行。
解决方案是将我对 addData(data)
的直接调用更改为发出一个信号来执行加法,从而将实际工作移回主线程。
关于c++ - ListView 最初不显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43620606/