2013-03-05 12 views
10

Mam QDialog, stworzony z Qt Designer, który wygląda tak: DialogSygnał, gdy wybór QListView zmienia się z powodu działania klawiatury?

Lista serwerów po lewej stronie jest QListView z QStringListModel. Kliknięcie myszką na element na liście powoduje zaktualizowanie formularza o informacje dotyczące wybranego elementu poprzez połączenie sygnału aktywowanego widoku (QModelIndex) z funkcją szczelinową w oknie dialogowym.

Jednak naciśnięcie przycisku w górę lub w dół na klawiaturze zmienia również wybrany element, ale sygnał nie jest emitowany, dlatego formularz nie jest aktualizowany w celu dopasowania do wybranego elementu. Jak to może zostać naprawione?

Odpowiedz

20

Sygnał activated(QModelIndex) faktycznie odnosi się do czegoś więcej niż tylko akt wyboru. Ta koncepcja jest raczej niejasna, ale bardziej przypomina akt wyboru. Jeśli szukasz powiadomienia, że ​​obecny wybór się zmienił, możesz pobrać model wyboru i połączyć się z jego aktualizacjami.

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()); 
    } 
} 

W powyższym kodzie, displayModelIndexInMyView(QModelIndex) należy zastąpić obecnego gniazda Handler activated(QModelIndex) i clearMyView() zastąpić cokolwiek to jest, że chcesz robić, kiedy nie ma nic zaznaczone.

Jest na to wiele sposobów i szczerze mówiąc nie jestem pewien, co to jest kanoniczne, ale myślę, że to zadziała.

+0

Dzięki za odpowiedź, ale mogę uzyskać sygnał/gniazdo do połączenia. W czasie wykonywania otrzymuję następujący błąd: "Brak takiego gniazda ConnectDialog :: handleSelectionChanged (QItemSelection)". Funkcja istnieje i wygląda tak jak twoja ... jakieś pomysły? –

+0

Czy umieściłeś to w "prywatnych gniazdach", kiedy zadeklarowałeś to w nagłówku? – cgmb

+0

D'oh ... Nie, nie zrobiłem. Dziękuję za pomoc! –

0

Innym sposobem jest implementacja funkcji wirtualnej QListView::currentChanged(...).