2013-03-05 33 views
10

ben gibi pek görünüyor QT Designer ile oluşturulan bir QDialog, var. Liste görünümünde bir öğeye tıklandığında fare, görünümün etkinleştirilmiş (QModelIndex) sinyalini iletişim kutusundaki bir yuva işlevine bağlayarak seçilen öğeyle ilgili bilgileri günceller.QListView seçimi klavye etkinliği nedeniyle değiştiğinde sinyal mi geliyor? <img src="https://i.stack.imgur.com/CtfrF.png" alt="Dialog"></p> <p>soldaki sunucuların listesi, bir QStringListModel ile QListView geçerli:

Ancak yukarı basarak veya aşağı klavyede de seçili öğeyi değiştirir, ancak hiçbir sinyal duyulur, böylece formu seçili öğeyi eşleşecek şekilde güncellenir değildir. Bu nasıl düzeltilebilir?

cevap

20

activated(QModelIndex) sinyal aslında seçimi sadece davranışından daha bir şey ifade eder. Kavram oldukça belirsiz, ama daha açık bir seçim yapma eylemine benziyor. Mevcut seçimin değiştiğine dair bir bildirim arıyorsanız, seçim modelini alabilir ve güncellemelerine bağlanabilirsiniz. Yukarıdaki kodda

MyView::MyView() { 
    QListView* view = new QListView(this); 
    connect(view->selectionModel(), 
     SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 
     this, SLOT(handleSelectionChanged(QItemSelection))); 
} 

... 

MyView::handleSelectionChanged(const QItemSelection& selection){ 
    if(selection.indexes().isEmpty()) { 
     clearMyView(); 
    } else { 
     displayModelIndexInMyView(selection.indexes().first()); 
    } 
} 

, displayModelIndexInMyView(QModelIndex) activated(QModelIndex) için geçerli işleyicisi yuvası ile değiştirilmesi gerekir ve clearMyView() o seçtiğiniz şey yokken yapmak istediğiniz ne olursa olsun değiştirilir.

Bunu yapmanın pek çok yolu var ve dürüstçe kurallı biridir ne olduğundan emin değilim, ama bu sizin için çalışacaktır düşünüyorum.

+0

cevap için teşekkürler, ama ben sinyal/yuvası bağlamak için elde edebilirsiniz. Çalışma zamanında aşağıdaki hatayı alıyorum: "Böyle bir yuva ConnectDialog :: handleSelectionChanged (QItemSelection)". Bu fonksiyon var ve tıpkı seninki gibi mi? –

+0

Bunu, başlıkta bildirdiğinizde "özel yuvalar" ın altına koydun mu? – cgmb

+0

D'oh ... Hayır yapmadım. Yardım için teşekkürler! –

0

başka yolu QListView::currentChanged(...) sanal fonksiyonunu uygulamaktır.