我正在创建一个如上所述的完成器,它是 QTreeView(用于内容)和 QLabel(用于标题)的组合。我自己构建了列表,没有继承自 QCompleter,而是继承自 QWidget。
Completer::Completer( QWidget *p_parent ) : QWidget( p_parent )
{
setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Popup );
QGridLayout *tableViewLayout = new QGridLayout( this );
tableViewLayout->setSpacing( 0 );
tableViewLayout->setMargin( 0 );
m_title = new QLabel;
.....
tableViewLayout->addWidget( m_title );
m_view = new CompleterView();
m_style = new CompleterStyle();
m_view->setStyle( m_style );
m_view->setItemDelegate( new CompleterDelegate( m_view ) );
m_sourceModel = new CompleterSourceModel( this );
m_proxyModel = new CompleterProxyModel( this );
m_proxyModel->setSourceModel( m_sourceModel );
m_view->setModel( m_proxyModel );
tableViewLayout->addWidget( m_view );
}
完成者上方是 QLineEdit。当我点击灯泡或在 LineEdit 中写一些东西时,将显示完成者。理论上,完成者应该有焦点,因为我在上面的构造函数中设置了setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Popup );
。但我希望 LineEdit 总是有焦点,所以我可以继续写。我使用了这里提到的方法,重点仍然在 LineEdit。
现在您看到上面的 QTreeView 有鼠标悬停效果,当我将鼠标移到一条线上时,该线有一个橙色背景。我是在paint
代表的职能上做到的。现在我想做同样的效果,但从键盘。我不知道该怎么做,因为完成者现在没有焦点了(焦点仍然在 LineEdit 中)。我调试(按键盘上的上下键),有时滚动条会移动,索引坐标总是(-1,-1)。我不知道为什么,因为我如何控制 Completer 同时它没有焦点??????(但这是另一个问题,我应该弄清楚)。
如何从键盘在这里创建相同的效果?你能给我一个提示或方向吗?