2017-02-22 5 views
0

J'ai un QListView qui est rempli avec un QStandardItemModel ou un QStringListModel (basé sur la simplicité du contenu ... nombre de colonnes).QListView avec QStandardItemModel n'affiche pas la surbrillance de sélection à travers le code

En charge ou en basculant entre les widgets, je recherche l'élément qui doit être sélectionné et j'essaie de le mettre en surbrillance.

if (first) 
{ 
    m_myListView.setModel(m_standardItemModel); 

    QList<QStandardItem*> lst = m_standardItemModel->findItems(m_value1, Qt::MatchExactly, 1); 
    if(!lst.isEmpty()) 
    { 
     QModelIndex index = lst.at(0)->index(); 
     qDebug() << index.row();     // tells me correct row 
     //m_myListView.setCurrentIndex(index); // no change if I use 
     m_myListView.selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); 
     m_myListView.scrollTo(index); 
    } 
} 
else 
{ 
    m_myListView.setModel(m_stringListModel); 

    int i = m_stringListModel->stringList().indexOf(m_value2); 
    if (i >= 0) 
    { 
     QModelIndex index = m_stringListModel->index(i); 
     m_myListView.selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); 
     m_myListView.scrollTo(index); 
    } 
} 

La version m_stringListModel met en évidence correctement (et défile au point).
La version m_standardItemModel ne met pas en surbrillance la ligne et ne fait pas défiler jusqu'à l'élément. Mais dans les utilisations après, il fournit correctement les données pour l'index sélectionné:

QModelIndexList indexList = m_myListView.selectionModel()->selectedIndexes(); 
if (!indexList.isEmpty()) 
{ 
    QModelIndex index = indexList.first(); 
    if (index.isValid()) 
    { 
     row = index.row(); 
     data1 = m_standardItemModel->index(row, 1).data().toString(); 

...

Alors ... il semble que la sélection fonctionne, mais si elle le fait, pourquoi je ne vois pas un point culminant? (et le scrollTo())

Remarque - le code est assez géant mais j'ai vérifié la possibilité de recharger le modèle et éventuellement perdre la sélection - et d'ailleurs, la version QStringListModel fonctionne correctement.

Est-ce un comportement typique de QStandardItemModel, ou est-ce que je dois faire quelque chose, comme le réglage d'une donnée de type BackgroundRole?

Comment puis-je mettre en surbrillance la sélection de la vue de liste avec le QStandardItemModel appliqué?

Répondre

0

Parce que l'article trouvé est différent de l'élément d'affichage, l'affichage de la liste est incapable de le sélectionner ...

2 solutions: soit créer un QModelIndex différent de celui trouvé, pointant vers la colonne d'affichage, ou sélectionnez une ligne entière contenant l'index désiré:

m_myListView.selectionModel()->select(index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); 
1

Je vois votre code, probablement vous voulez sélectionner le premier élément de votre modèle? Essayons:

void MyClass::selectFirstElement() { 
    const QModelIndex firsIndex = _myModel->index(0,0); 
    if (index.isValid()) 
     ui->listView->setCurrentIndex(firstIndex); 
     ui->listView->scrollTo(firstIndex); 
    } 

}

Pourriez-vous la mise en œuvre m_standardItemModel? Configurez également votre liste correctement:

ui->listView->setSelectionMode(QAbstractItemView::SingleSelection); 
ui->listView->setSelectionBehavior(QAbstractItemView::SelectRows); // Or Columns 

Vérifiez si votre QStandarItem a la sélection flag permettent. Voir http://doc.qt.io/qt-4.8/qt.html#ItemFlag-enum pour plus d'informations.

Enfin, vous pouvez faire en sorte que l'index est stocké dans le bon modèle en obtenant l'index dans la même ligne & colonne directement à partir du modèle, quelque chose comme ceci:

QModelIndex index = lst.at(0)->index(); 
index = _model->index(index.row(), index.column()); 

Désolé, pour mon pauvre anglais : S