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

时间:2017-02-22 15:22:34

标签: qt qlistview qstandarditemmodel

我有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的情况下突出显示列表视图的选择?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

由于找到的项目与显示项目不同,因此列表视图无法选择它......

2个解决方案:要么找到一个QModelIndex,指向显示列,要么选择包含所需索引的整行:

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