Qt 强制当前索引即使在失去焦点后也显示在QAbstractItemView中

Qt 强制当前索引即使在失去焦点后也显示在QAbstractItemView中,qt,widget,focus,qabstractitemview,Qt,Widget,Focus,Qabstractitemview,我有一个qabstractemviewsayQListView的实例,其中selectionMode设置为Qt::NoSelection。当我激活小部件时,我可以看到当前索引高亮显示。但是,当我聚焦另一个小部件时,QListView的当前索引不再突出显示。我需要当前的索引始终突出显示,无论哪个小部件有焦点 您可以使用此事件筛选器执行此操作: bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == ui

我有一个
qabstractemview
say
QListView
的实例,其中
selectionMode
设置为
Qt::NoSelection
。当我激活小部件时,我可以看到当前索引高亮显示。但是,当我聚焦另一个小部件时,
QListView
的当前索引不再突出显示。我需要当前的索引始终突出显示,无论哪个小部件有焦点

您可以使用此事件筛选器执行此操作:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

    if (obj == ui->listView && event->type() == QEvent::FocusOut)
    {
        //when view loses focus we highlight current item
        ui->listView->selectionModel()->select( ui->listView->currentIndex(), QItemSelectionModel::Select );
    }
    if (obj == ui->listView && event->type() == QEvent::FocusIn)
    {
        //when view gets focus we clear selection
        ui->listView->selectionModel()->clear();
        ui->listView->selectionModel()->select( ui->listView->currentIndex(), QItemSelectionModel::Select );
    }
    return QObject::eventFilter(obj, event);
}
要使用
eventFilter
,还应:

protected:
    bool eventFilter(QObject *obj, QEvent *event);//in header


如果你不想使用事件过滤器,你可以将view子类化,然后重新实现focusInEvent(QFocusEvent*event)和focusOutEvent(QFocusEvent*event)并做同样的事情。

我只是试过了,但没有做我想要的事情。我只是在焦点上选择当前索引。一个问题是,所选内容看起来与当前索引高亮显示不同。第二个问题是,当前索引正在从小部件外部更改,我需要小部件始终正确显示当前索引。@在外部更改时,请使用
ui->listView->selectionModel()->clear()
ui->listView->selectionModel()->select(ui->listView->model()->index(0,0),QItemSelectionModel::select)一切都会好起来的。选择的颜色是绝对重要的吗?事实上,如果颜色不同,它看起来会很难看。这并不是完全违反协议,但情况相当糟糕。实际上,我更愿意使用不同的方式突出显示当前项目-即粗体字体替换颜色。@tach,这样您就可以使用QFont设置粗体字体,例如:
ui->listView->model()->setData(ui->listView->currentIndex(),someFont,Qt::FontRole)是的,如果我不能计算出当前的索引,我可能会这样做。谢谢:)
qApp->installEventFilter(this);//in constructor