我有QListView
,其中填充了QStandardItemModel
或QStringListModel
(基于内容的简单性......列数)。
在加载或在窗口小部件之间切换时,我会搜索应该选择的项目,并尝试突出显示它。
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 :(得分: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);