2016-04-12 20 views
2

QML TableView'da dizini verilen satır yüksekliğini değiştirmek için basit bir yol var mı?QML TableView Öğesi satırlarını dinamik olarak ve ayrı ayrı değiştirme

Sorun şu ki dinamik olarak veri yüklerim TableView'ın modeli. Qt RichText HTML etiketlerini (ul, li) kullanarak uyarıların listesini görüntülemek istediğim bir "uyarı" sütunum var. Ancak, bu liste onu içeren hücreden daha yüksektir ve y-taşması vardır.

QTableView sınıfı, setRowHeight (int satır, int yükseklik), resizeRowToContents (int satır) veya resizeRowsToContents() gibi bu sorunu çözmek için birçok yönteme sahiptir.

Ama QML eşdeğer kolayca satırı yeniden boyutlandırmak için bu tür yöntemleri yok gibi görünüyor ...

rowDelegate benim sorunu çözmek olabilir ama satırlara ait yükseklikleri değiştirmek için nasıl kullanılacağını bilmiyorum ayrı ayrı (Ben onun endeksi) demek.

Herkes aynı sorunu yaşıyor mu ve çözmek için bana bir numara verebilir mi?

Benim TableView: my TableView güncelleme

ListModel { 
id: filesList 
ListElement { 
    name:"" 
    dir:"" 
    type:"" 
    status"" 
} 
} 

TableView { 
id: filesTable 
TableViewColumn { 
    id:nameColumn 
    role: "name" 
    title: "Name" 
    width: dropFiles.width*.2 
} 
TableViewColumn { 
    id:dirColumn 
    role: "dir" 
    title: "Path" 
    width: dropFiles.width*.8 
} 
TableViewColumn { 
    id:typeColumn 
    visible: false; 
    role: "type" 
    title: "Type" 
    width: dropFiles.width*.2 
} 
TableViewColumn { 
    id:statusColumn 
    visible: false; 
    role: "status" 
    title: "Status" 
    width: dropFiles.width*.3 
} 
rowDelegate: Rectangle { 
    anchors { 
     left: parent.left 
     right: parent.right 
     verticalCenter: parent.verticalCenter 
    } 
    height: parent.height 
    MouseArea { 
     anchors.fill: parent 
     acceptedButtons: Qt.RightButton 
     onClicked: { 
      if (mouse.button == Qt.RightButton) 
      { 
       if(styleData.selected){ 
        rowContextMenu.popup(); 
       } 
       else { 
        filesTable.selection.deselect(0, filesTable.rowCount-1); 
        filesTable.selection.select(styleData.row); 
        rowContextMenu.popup(); 
       } 
      } 
     } 
    } 
} 
anchors.fill: parent 
selectionMode: SelectionMode.ExtendedSelection 
model: filesList 
} 

JS işlevi:

function displayParsingStatus(){ 
    for(var i= 0; i<newModel.files.length; ++i){ 
     switch(newModel.files[i].status){ 
      case 0: 
       filesList.get(i).status="<font color=\"green\">Success</font>"; 
       break; 
      case 1: 
       var status =""; 
       status += "<ul>"; 
       for(var j=0; j < newModel.files[i].warnings.length;j++){ 
        status += "<li><font color=\"orange\">Warning: " + newModel.files[i].warnings[j] + "</font></li>"; 
       } 
       status += "</ul>"; 
       filesList.get(i).status=status; 
       break; 
      case 2: 
       filesList.get(i).status="<font color=\"red\"><b>Error: " + newModel.files[i].error + "</b></font>"; 
       break; 
      case 3: 
       filesList.get(i).status="Ignored"; 
       break; 
     } 
    } 
} 

cevap

2

Zaten QML temsilci elemanı üzerindeki yükseklik ayarı ediyoruz:

height: parent.height 

O var yüksekliği ana boyuta bağlar. Yüksekliği bir ifadeyle ayarlarsanız, ifadenin öğelerinde herhangi bir değişiklik olduğunda her seferinde tetiklenir (ve yeniden değerlendirilir).

Bu nedenle, QML özelliklerinin bir NOTIFY sinyali vardır.

Yüksekliği başka bir öğeye bağlamak istiyorsanız, bunu yalnızca yükseklik özelliğine atamanız gerekir.

Ben denemedim ama childrenRect aradığınız şey olabilir: http://doc.qt.io/qt-5/qml-qtquick-item.html#childrenRect.height-prop

Ayrıca özelliğine değerlerini atamak için üçlü operatörünü kullanabilirsiniz yani: denedim

height: (model.get(styleData.row)[styleData.role] === 0)?30:100 
+0

childrenRect.height kullanın ama işe yaramadı. Üçlü operatörünü de kullanmaya çalıştım. ListElements içinde "rowHeight" adlı bir özellik ekledim ve bunu delegede kullanıyorum. Çalışıyor ancak listemde 14.000'den fazla öğe olduğu için şimdi bir performans sorunum var. Neyse cevabın için teşekkür ederim – Mario

İlgili konular