2016-03-24 17 views
0

Referans için QT dokümanı aradım ancak bazı sorularım var.QT'de özelleştirilmiş model için removeRow() işlevi nasıl uygulanır?

bool TableModel::removeRows(int position, int rows, const QModelIndex &index) 
{ 
    Q_UNUSED(index); 
    beginRemoveRows(QModelIndex(), position, position + rows - 1); 

    for (int row = 0; row < rows; ++row) { 
     listOfPairs.removeAt(position); 
    } 

    endRemoveRows(); 
    return true; 
} 

Ben doğrudan modelindeki veri bulmak için tableview index.row kullanır düşünüyorum: İşte QT doc uygulamasıdır. Ama tablo görünümü için sıralama etkinleştirirseniz? Sıralamadan sonra, tablo görünümündeki dizin modeldeki verilere karşılık gelmez. Tablo görünümündeki ilk satır, modeldeki üçüncü veri olabilir.

Modeldeki verileri nasıl tablo görünümünde bulabilirim? Ve removeRow() işlevi için daha iyi uygulamalar var mı?

cevap

0

,

model/görünüm mimarisi sıralama yaklaşan iki yolu vardır: o QAbstractItemModel reimplements eğer, modeliniz sıralanabilir ise, yani :: sort() işlevi, hem QTableView hem de QTreeView, model verilerinizi programsal olarak sıralamanızı sağlayan bir API sağlar. Modeliniz gerekli arabirime sahip değilse veya verilerinizi görüntülemek için liste görünümü kullanmak istiyorsanız, alternatif yaklaşım, verileri

görünümüne sunmadan önce modelinizin yapısını dönüştürmek için bir proxy modeli kullanmaktır.

Sıralamayı değiştirdiğinizde, modeliniz için sıralama ayarlamanıza bağlı olarak ne olur: görünümde sıralama, modeldeki satırların düzenini değiştirir veya yalnızca proxy modeli için bu düzenlemeyi değiştirir.

Proxy modelini kullanırsanız, proxy modelinin satırları arasında (bu, bunları geçerli sıralama ile gördükleri şekilde) ve orijinal modelin satırları arasında bir miktar eşleme ekleyebilirsiniz. Ya da orijinal modelde bu satır için gerçek veri öğesi arasında satır eşlemesi ekleyebilirsiniz. Hatta veri nesnesine, QAbstractItemModel::createIndex modelinizin yeniden uyarlanmasında doğrudan QModelIndex içine gömülebilir ve ardından işaretçi Dizindeki öğe removeRow gibi yöntemlere geçirildi. Başka bir olasılık ise, operate ile doğrudan işaretçi yerine öğenin bazı tamsayı tanımlayıcısıdır. Bu nedenle, satırlar ve gerçek model öğeler arasında hangi eşleştirmeyi seçmeniz gerektiği size kalmış.

İlgili konular