2011-11-15 14 views
5

Öğeler için boyut ayarlamak ve özel boya yapmak için kullandığım bir Öğe temsilcisiyle (QStyledItemDelegate) birden çok seçim etkinleştirilmiş bir QListView var. Benim gereksinimleri son derece basittir: Seçilen öğelerin Öğe temsilci ile QTListView - Seçilen öğeler için Taller madde satırları

olmayan seçilen öğelerin

  • Satır yüksekliği 60

    1. Satır yüksekliği 30 bu işe alınamıyor.

      aynı deyimi seçilen satır ve seçili olmayan arasında ayrım, aynı sınıftan üzerinde boyama yöntemi için mükemmel çalışıyor çünkü eğer garip olan durum seçilen asla

      if (option.state & QStyle::State_Selected) 
      { 
          return QSize(100,60); /// <<<<------ NEVER REACHED 
      } 
      else 
      { 
          return QSize(100,30); 
      } 
      

      benim QStyledItemDelegate üzerinde sizeHint kullanarak çalıştı farklı boya arka plan için satırlar.

      Sonra benim temsilci üzerinde sizeHint yöntemine erişilebilir seçim modeli (QItemSelectionModel) yapılan

      başka bir şey denedik. Bunu kullanarak, doğrulama için çağrılan satırın seçilip seçilmediğini ve doğru boyutu döndürdüğümü başarılı bir şekilde sorgulayabilirim. Ancak şimdi sadece doğru boyutta çizim yapılıyor. Seçilen öğeler için, çizim artık 60'lık bir yüksekliğe sahiptir, bu doğrudur, ancak altındaki öğeleri üst üste bindirir. Diğer bir deyişle: yeni sizeHint boyutu yalnızca ÇİZİM için kullanılır, ancak QListView öğesi uzunluğunu gerçekten yapmak için kullanılmaz. Görünüşe göre listeyi “güncelleştirmek” için eksik bir çağrı var, öğelerinden birinin boyutunun değiştiğini görün. Sadece öğeyi daha uzun çizmeye ihtiyacım yok, bu amaçla ürününün daha uzun olmasını istiyorum.

      SizeHintHint'in başlangıçta her şey başlatıldığında öğe yüksekliğinde etkisi olduğu görülüyor. Eğer birden bire, sizeHintinizden gelen öğelerden biri için daha yüksek bir yükseklik değeri getirirse - yeni yüksekliği karşılamak için liste görünümünü genişletmez.

      ilginç bir gözlem:

      Ben boyutunu sabitleme, benim QListView üzerinde (QListView :: ayarlayın), kontrol için hafif boyutlandırma tüm öğelerin yeniden calc tetikleyecek setResizeMode ayarlarsanız fiili seçilen öğe (her zaman doğru yükseklikte yapılır) gibi çizim öğesi, öğe yüksekliği artık doğru olduğu için, öğenin üzerinde kademeli olarak değişmez. Seçim değişiklikleri olarak yapmam gereken budur, QLiustView :: Adjust Causes gibi bir "re-calc" a sebep olur. Bunu nasıl yaparım?

      Şu an yaptığım şey çirkin, ve ben de olumluyım, bunu yapmanın bir yolu yok, ama başka bir alternatifim yok. Seçim modeline bağlanıyorum - seçim değişikliklerini dinliyorum, ve geldiklerinde, QlistView'umun yüksekliğini 1 olarak yeniden boyutlandırıyorum ve sonra orijinal boyuta geri dönüyorum. Bu, öğe boyutlarının (setResizeMode (QListView :: Adjust) yeniden hesaplanmasını üretir ve her şey iyi görünür ve çalışır. Bunu yapmak zorunda kaldığımda mide bulaştırır. Öğelerin yüksekliğini yeniden hesaplamak için daha iyi bir yol yoktur. QListView bir yeniden boyutlandırma taklit ederek?

  • cevap

    1

    üst Nokia Qt geliştiricileri ile Onaylandı - Ben görünüşte yapıyorum kesmek bu şey halletmek için tek yoldur:

    Şimdi ne yapıyorum çirkin olduğunu ve bu kadar pozitif değilim Bunu yapmanın yolu değil, ama başka bir alternatifim yok. Seçim değişikliklerini dinlerken modelinin seçimini yapıyorum ve geldikleri zaman, QlistView'ımın yüksekliğini 1 olarak yeniden boyutlandırıyorum ve sonra orijinal boyutuna geri dönüyorum. Bu öğenin bir yeniden hesaplama (setResizeMode (QListView :: ayarlayın) boyutları üretir ve her şey görünüyor ve gayet iyi çalışıyor.

    İlgili konular