2017-02-22 27 views
0

У меня есть QListView, который заполнен либо QStandardItemModel, либо QStringListModel (на основе простоты содержимого ... количества столбцов).QListView с QStandardItemModel не показывает выделение выделения с помощью кода

При загрузке или переключении между виджетами я ищу элемент, который должен быть выбран, и попробуйте выделить его.

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

версия m_stringListModel правильно подчеркивает (и свитки пункта).
Версия m_standardItemModel не выделяет строку и не прокручивает элемент. Но в целях впоследствии, он правильно предоставляет данные для выбранного индекса:

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

...

Так ... кажется, что отбор работает, но если это так, почему я не вижу выделить? (и scrollTo())

Примечание - код довольно гигапитен, но я проверял возможность перезагрузки модели и, возможно, потерял выделение, - кроме того, версия QStringListModel работает правильно.

Это типичное поведение QStandardItemModel, или есть что-то, что я должен сделать, например, установить данные типа BackgroundRole?

Как я могу выделить выбор вида списка с применением QStandardItemModel?

ответ

0

Поскольку находка отличается от пункта отображения, в виде списка не может выбрать его ...

2 решения: либо создать другой QModelIndex из найденных, указывая на колонку дисплея, или выберите целую строку, содержащую нужный индекс:

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

Я вижу ваш код, возможно, вы хотите выбрать первый элемент своей модели? Давайте попробуем:

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

}

Не могли бы вы поделиться реализации m_standardItemModel? Также настроить список правильно:

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

Проверьте, если ваш QStandarItem имеет выбор flag включения. См. http://doc.qt.io/qt-4.8/qt.html#ItemFlag-enum для получения дополнительной информации.

Наконец, вы можете убедиться, что индекс хранятся в правильной модели, получая индекс в той же строке & столбца непосредственно из модели, что-то вроде этого:

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

К сожалению, для моего бедного английского : S