2017-04-25 29 views
0

My QML ListViewは、マウスで摂動するまでデータを表示しません(例:)。この後、ビューはモデルが空でなくなるまで問題なく表示されます。それから私はもう一度それを働かせるためにそれを混乱させる必要がある。このListViewを動作させる方法はありますか?ListViewが最初にデータを表示していません

私はLinux 14.04でQt 5.8を使用しています。私のモデルはQAbstractListModelのサブクラスです。私はAbstractItemModel Exampleに従ってそれを構築します。主な違いは、リストモデルがsetContextPropertymain.cppに設定されているのではなく、エンティティのプロパティであることです。

ListViewについてはまだ更新されていませんが、最初は問題がないようです。それらのほとんどはdataChanged代わりに手動のbeforeInsertRows() & endInsertRows()を呼び出すOPに関連する - 私は呼んでいる両方の方法は、(下記参照。)

マイListViewSceneLoaderを搭載した項目です。

I posted all the relevant code here、私は私が私の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

あなたの提供したコードでできる限りコードをテストしました。簡単にするために、BlobオブジェクトをQStringsに置き換えました。私はaddBlob()をAbstractItemModelの例とまったく同じようにしました。それは私のためにうまくいった。 [コードはこちら](https://gist.github.com/anonymous/1a41d90c212c73086fe81c41374b9661) –

+0

モデルをどのように埋め込みましたか?最初のデータがモデルに存在していればうまくいきましたが、問題は実際にモデルが空だったとき(スタートアップ時またはモデルが空になったとき)でした。それを見てくれてありがとう、実際に作成しようとします完全な最小限の例を示します。次に、あなたの例のように文字列で試してみましょう。 – Matt

+0

ええと、私は[最小限のコンパイル可能な例(https://github.com/kheaactua/listview_issue/tree/master/listview_issue)を設定しました。午前中は、元のコードに近づけて問題の開始位置を確認してから、このコメントを削除します。 – Matt

答えて

0

コメントに指摘されているように、問題はメインスレッドの外でモデルを修正していることでした。

addDataを直接呼び出すと、別のスレッドがモデルに追加をトリガーするようにコードが設定されました。私の最小限の例ではこれを複製できなかったのは、QTimerを使ってもう1つのスレッドをシミュレートしたためですが、QTimerもメインスレッドで実行されています。

解決策は私の直接呼び出しをaddData(data)に変更して追加を行う信号を出し、実際の作業をメインスレッドに戻すことでした。

関連する問題