2017-02-22 9 views
0

QStandardItemModelまたはQStringListModel(内容の単純さ...列数に基づいています)のいずれかが入力されたQListViewがあります。QStandardItemModelを使用したQListViewでは、コードによる選択のハイライトが表示されません。

ウィジェットの切り替え時に、選択する項目を検索して強調表示させます。

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

関連する問題