2016-04-14 53 views
0

Sadece Qt'de çalışmaya başladım ve ListView modelinin elemanlarını çalıştıran bir işlev yapmaya çalışıyorum.ListView model işlevi

Ben özel gibi durumu vardır "myButton.qml" düğmesini yaptık "normal",

ListView "main.qml" olduğunu, vb "seçilmiş" "basılı". Yani burada

ListView{ 
    //... 

    model: nameModel 

    delegate: myButton { 
     //... 
    } 

} 

benim hedeftir: Yapısı böyledir düğmelerin bu liste RadioButtons grubuna gibi hareket etmelidir - tek seçmiş olabilir devlet ve düğmeye bastığınızda seçilen devlettir. Tıklama işleyicisine sahip olmalı ve düğmeyi tıklayan bir işlevi kullanmalıyım. İşlev, tuşların listesini kontrol etmeli ve işlevden önce bir düğme seçilmişse, durumunu "Normal" olarak değiştirir.

Bu işlevi nasıl yazacağım konusunda hiçbir fikrim yok ve nereye yerleştirmeliyim. Qt belgelerini okudum ama yine de hiç bir fikrim yok.

cevap

1

Bu sorunu çözmek için olası kolay bir yol, ExclusiveGroup'dan yararlanmaktır. documentation tartışıldığı gibi, bu tür destek herhangi tipi eklenebilir:

bir amacı, ya da kontrol için ExclusiveGroup desteği eklemek mümkündür. Bu bir özelliği kontrol olmalı ve ya bir toggled, () veya toggled (bool) sinyalini checkedChanged. Ayrıca, ExclusiveGroup yazılan özelliği ayarlandığında, ExclusiveGroup :: bindCheckable() ile bağlı olması gerekir.

Sen ListView düzeyinde bir ExclusiveGroup tanımlayabilir ve ListView delege gerekli mantığı uygulayabilirsiniz. ExclusiveGroup delegesini ExclusiveGroup özelliğine numaralı özelliğe bağlayarak, modeli tarayan bir işleve gerek kalmadan istediğinizi elde etmelisiniz.

Final oyuncak örneği kullanımını göstermek için:

import QtQuick 2.5 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 


Window { 
    id: root 
    visible: true 
    width: 200 
    height: 500 

    ListView { 
     anchors.fill: parent 
     model: 10 
     spacing: 20 
     ExclusiveGroup { id: ex } // the group for all the delegate 

     delegate: Rectangle { 
      id: delegate 
      width: ListView.view.width 
      height: 30 
      color: checked ? "yellow" : "steelblue" 

      // code to have exclusive behaviour 
      property bool checked: false 
      property ExclusiveGroup exclusiveGroup: ex 

      onExclusiveGroupChanged: { 
       if (exclusiveGroup) 
        exclusiveGroup.bindCheckable(delegate) 
      } 

      // mouse area to trigger the property change 
      MouseArea { 
       anchors.fill: parent 
       onClicked: checked = true 
      } 
     } 
    } 
} 
+1

böyle güzel örnek için teşekkür ederiz! Anlaması çok kolay görünüyor. – Pillar

+0

Yararlı olduğuna sevindim. Mutlu kodlar! :) – BaCaRoZzo