c++ - ListView 最初不显示数据

标签 c++ qt listview qml

我的 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/

相关文章:

c++ - 来自 Xcode 编写的 C++ 程序的 Linux Makefile

c++ - 来自 GLFW 上下文的 QOpenGLContext

Qt 安装程序脚本 API : Can't select latest Qt version in online installer

android - 用于 ListView 宽度的 wrap_content

c++ - C++ 中的克隆函数

c++ - 在 CMake 中使用别名目标

android - 实现弹出菜单 ListView

android - 处理程序调用 notifyDataSetChanged() 未执行

c++ - 展开和转发阵列

qt - 在哪里可以找到旧版本的 QT(例如 QT 4.6)?