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
sayQListView
的实例,其中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