2016-04-05 31 views
2

私はQMLでListView持っている:すべてはListView自動的に更新され、正常に動作しますListModelに要素を追加した後にQML ListViewを更新するにはどうすればよいですか?

QVariant qv(QString("image://plots/").append(imageName)); 
QMetaObject::invokeMethod(plotList, "addImage", Q_ARG(QVariant, qv)); 

:私は画像提供と機能addImage(src)を使用して、いくつかの項目を追加最初に

ListView { 
    id: listView1 
    width: parent.width 
    height: parent.height 
    interactive: true 
    clip: true 
    visible: true 

    property int elementH: 200 

    Component.onCompleted: { 
     mSingals.setPlotList(listView1); 
    } 

    function addImage(src) { 
     listModel.append({"imageSrc": src}); 
    } 

    function clear() { 
     listModel.clear(); 
    } 

    function redraw() { 
     // ????? 
     //listView1.update(); 
    } 

    model: ListModel { 
     id: listModel 
     objectName: lModel 
    } 

    delegate: Rectangle { 
     id: delegateItem 
     width: listView1.width; height: listView1.elementH 
     color: "blue" 
     Image { 
      anchors.left: parent.left 
      source: imageSrc 
      visible: true 
     } 
    } 
} 

を。 それから私はListModelからすべての項目をクリアして、いくつかの新しいものを追加:

QMetaObject::invokeMethod(plotList, "clear"); 
QVariant qv(QString("image://plots/").append(someNewImage)); 
QMetaObject::invokeMethod(plotList, "addImage", Q_ARG(QVariant, qv)); 

ListViewもようなもので更新されません。だから私は数回上下にスクロールし、する必要が

QMetaObject::invokeMethod(plotList, "redraw"); 

古い要素を消して新しい要素が表示されるようにしますが、とにかく、20の最初の要素は、私が何をしても同じままです。

ListViewを更新するにはredraw()で何を使用しますか? dataChangedのシグナルがListModelのように出力されることがありますか?

+0

clear()の代わりにremove()を使用してみてください。私は、あなたがclear()を実行するときに動的な役割が削除されたと考えています。 –

答えて

0

正しい動作をさせるために何もする必要はありません。私は、問題はC++からの処理を行うことと関係していると考えています。これは、ブロックされた形で起こり、オブジェクトに処理される時間を与えません。

invokeMethod()のキューに接続してみてください。

QMetaObject::invokeMethod(plotList, "addImage", Qt::QueuedConnection, Q_ARG(QVariant, qv)); 

しかし、「悪いデザイン」を綴る++ CからQMLの機能にアクセスする、あなたは本当にQMLはない、その逆、C++にアクセスしなければならない、ということやってはいけません。 C++の実際の文字列をそれほど作成する必要がない場合は、シグナルを使用してその文字列を出力し、それをQMLハンドラに接続すれば、QMLのモデルとやりとりすることができます。

1

ありがとうございました!私の場合、問題は画像の名前にありました。名前は同じであり、イメージプロバイダはこの名前で新しいイメージを提供することができましたが、ListViewは新しいイメージを要求しませんでした。だから今私はすべての更新の名前を変更します。

0

これは、QMLイメージのcacheプロパティをfalseに設定することで解決する必要があります。 http://doc.qt.io/qt-5/qquickimageprovider.htmlのイメージキャッシュセクションから:

QQuickImageProviderから返されたイメージは、QMLエンジンによって読み込まれたイメージと同様に、自動的にキャッシュされます。 "image://"接頭辞を持つイメージがキャッシュからロードされると、関連するイメージプロバイダに対してrequestImage()およびrequestPixmap()は呼び出されません。イメージをイメージプロバイダから常にフェッチし、キャッシュする必要がない場合は、関連するイメージに対してcacheプロパティをfalseに設定してください。

関連する問題