带有 QStandardItemModel 的 QListView 不通过代码显示选择突出显示

QListView with QStandardItemModel does not show selection highlight through code

我有一个 QListView,其中填充了 QStandardItemModelQStringListModel(基于内容的简单性……列数)。

加载时,或在小部件之间切换时,我搜索应该选择的项目,并尝试突出显示它。

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 的列表视图的选择?

因为找到的项目与显示的项目不同,列表视图无法select它...

2 解决方案:创建一个与找到的不同的 QModelIndex,指向显示列,或者 select 包含所需索引的整行:

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

我看到了你的代码,你可能想要 select 你模型的第一个元素?让我们试试:

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 是否有 selection flag enable. See 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