2013-03-05 11 views
10

Ho un QDialog, creata con Qt Designer, che assomiglia così: DialogSegnale quando una selezione di QListView cambia a causa dell'attività della tastiera?

L'elenco dei server a sinistra è un QListView con un QStringListModel. Facendo clic con il mouse su un elemento nella visualizzazione elenco, il modulo viene aggiornato con le informazioni per l'elemento selezionato collegando il segnale attivato (QModelIndex) della vista a una funzione di slot nella finestra di dialogo.

Tuttavia, premendo su o giù sulla tastiera si modifica anche l'elemento selezionato, ma non viene emesso alcun segnale, quindi il modulo non viene aggiornato per corrispondere all'elemento selezionato. Come si puo aggiustare?

risposta

20

Il segnale activated(QModelIndex) in realtà si riferisce a qualcosa di più che l'atto di selezionare. Il concetto è piuttosto vago, ma è più come un atto di scelta esplicita. Se stai solo cercando la notifica che la selezione corrente è cambiata, puoi prendere il modello di selezione e collegarti ai suoi aggiornamenti.

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

Nel codice precedente, displayModelIndexInMyView(QModelIndex) dovrebbe essere sostituito con slot gestore corrente per activated(QModelIndex), e clearMyView() sostituito con qualunque è che si vuole fare quando non c'è niente selezionato.

Ci sono molti modi per farlo, e onestamente non sono sicuro di quello che è il canonico, ma penso che funzionerà per voi.

+0

Grazie per la risposta, ma posso ottenere il segnale/slot per la connessione. In fase di esecuzione viene visualizzato il seguente errore: "Nessuno slot di tipo ConnectDialog :: handleSelectionChanged (QItemSelection)". La funzione esiste e sembra proprio la tua ... qualche idea? –

+0

Lo hai messo sotto 'slot private:' quando lo hai dichiarato nell'intestazione? – cgmb

+0

D'oh ... No, non l'ho fatto. Grazie per l'aiuto! –

0

L'altro modo è implementare la funzione virtuale QListView::currentChanged(...).