ListView最初没有显示数据

时间:2017-04-25 20:44:27

标签: c++ qt listview qml

我的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的公共类型,并且因为一切都在没有它的情况下工作,我不是确实错过了确切的问题。

1 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,问题是我在主线程之外修改我的模型。

我的代码已设置好,以便另一个线程通过直接调用addData来触发我的模型的添加。我的最小示例无法复制的原因是因为在其中我使用QTimer来模拟其他线程,但QTimer也在主线程上运行。

解决方案是将我的直接调用更改为addData(data)以发出信号以进行添加,从而将实际工作移回主线程。