2017-02-22 2 views
0

Ich habe eine QListView, die entweder mit QStandardItemModel oder QStringListModel (basierend auf Einfachheit des Inhalts ... Anzahl der Spalten) besetzt ist.QListView mit QStandardItemModel zeigt keine Auswahl Highlight durch Code

Beim Laden oder Wechseln zwischen Widgets suche ich nach dem Objekt, das ausgewählt werden soll, und versuche, es hervorzuheben.

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

Die m_stringListModel Version hebt richtig (und blättert Punkt).
Die m_standardItemModel Version markiert keine Zeile und scrollt nicht zum Element. Aber in den Anwendungen danach sieht es richtig, die Daten für ausgewählten Index:

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

...

So ... es scheint, dass die Auswahl funktioniert, aber wenn es funktioniert, warum nicht ich sehe ein Highlight ? (und der

)

Hinweis - der Code ist ziemlich riesig, aber ich verifiziert für die Möglichkeit, das Modell neu zu laden und möglicherweise die Auswahl zu verlieren - und außerdem funktioniert die QStringListModel Version korrekt. Ist das ein typisches Verhalten von QStandardItemModel, oder muss ich etwas tun, z.

Wie kann ich die Auswahl der Listenansicht unter Verwendung der QStandardItemModel markieren?

Antwort

0

Weil das Einzelteil ist anders als das Anzeigeelement gefunden wird, sind die Listenansicht nicht in der Lage, es zu wählen ...

2 Lösungen: entweder erstellen eine anderes QModelIndex von der gefunden, auf die Anzeigespalte zeigt, oder Wählen Sie eine ganze Zeile mit dem gewünschten Index:

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

Ich sehe Ihren Code, wahrscheinlich möchten Sie das erste Element Ihres Modells auswählen? Lassen Sie uns versuchen:

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

}

Könnten Sie die m_standardItemModel Implementierung teilen? richtig konfigurieren Ihre Liste:

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

Überprüfen Sie, ob Ihre QStandarItem die Auswahl hat flag ermöglichen. Weitere Informationen finden Sie unter http://doc.qt.io/qt-4.8/qt.html#ItemFlag-enum.

Schließlich könnten Sie sicherstellen, dass der Index, indem sie den Index in der gleichen Zeile & Spalt direkt aus dem Modell, so etwas wie dies in dem richtigen Modell gespeichert ist:

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

Sorry, für mein armes Englisch : S

Verwandte Themen