Как создать эффект фокуса для QTreeView, пока у него нет фокуса? - PullRequest
0 голосов
/ 15 ноября 2018

enter image description here

Я создаю завершитель, как указано выше, который представляет собой комбинацию 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, в то время как он не имеет фокуса? (но это еще одна проблема, я должен выяснить).

Как я могу создать такой же эффект здесь с клавиатуры? Не могли бы вы дать мне подсказку или направление для этого?

...