Как установить Bold для сопоставления символов с QSortFilterProxyModel? - PullRequest
0 голосов
/ 24 августа 2018

Это пример на сайте Qt enter image description here В этом случае совпадающие символы не выделены жирным шрифтом, а другие символы выделены жирным шрифтом. Я хочу сделать наоборот: соответствующие символы должны быть жирным шрифтом, а другие не жирным шрифтом. Как я могу это сделать?

MyLineEdit.cpp

MyLineEdit::MyLineEdit( QWidget *p_parent ) : QWidget( p_parent )
{
  ............
  m_completer = new Completer();

  m_lineEdit = new QLineEdit;
  m_lineEdit->setObjectName( "lineEdit" );

  connect( m_lineEdit, &LineEdit::textChanged, this, &MyLineEdit::setTextForFilter );
}

void MyLineEdit::setTextForFilter( const QString &p_text )
{
  m_completer->setTextForFilter( p_text );
}

Completer.cpp

Completer::Completer( QWidget *p_parent ) : QWidget( p_parent )
{
  .........
  QGridLayout *tableViewLayout = new QGridLayout( this );
  m_caption = new Label;
  tableViewLayout->addWidget( m_caption );

  m_table = new QTreeView();
  m_table->setItemDelegate( new CompleterDelegate() );
  m_sourceModel = new CompleterModel( this );
  m_proxyModel = new CompleterProxyModel( this );
  m_proxyModel->setSourceModel( m_sourceModel );
  m_table->setModel( m_proxyModel );

  tableViewLayout->addWidget( m_table );
}

void Completer::setTextForFilter( const QString &p_text )
{
  QRegExp regExp( p_text, Qt::CaseInsensitive, QRegExp::RegExp );
  m_proxyModel->setFilterRegExp( regExp );
}

CompleterModel.cpp

QVariant CompleterModel::data( const QModelIndex &p_index, int p_role ) const
{
  int row = p_index.row();
  int col = p_index.column();

  switch ( p_role )
  {
     case Qt::DisplayRole:
        if ( col < m_completerData.rowData().at( row ).columnCount() )
        {
           return m_completerData.rowData().at( row ).columnData( col ).first;
        }
        break;
     case Qt::TextAlignmentRole:
        return Qt::AlignLeft;
     case Qt::UserRole:
        return QVariant( static_cast<int>( m_completerData.rowData().at( row ).type() ) );            
   }
   return QVariant();
}

CompleterProxyModel.cpp

bool CompleterProxyModel::filterAcceptsRow( int p_sourceRow, const QModelIndex &p_sourceParent ) const
{
  QModelIndex index0 = sourceModel()->index( p_sourceRow, 0, p_sourceParent );
  QModelIndex index1 = sourceModel()->index( p_sourceRow, 1, p_sourceParent );

  return ( sourceModel()->data( index0 ).toString().contains( filterRegExp() ) || sourceModel()->data( index1 ).toString().contains( filterRegExp() ) );
}

1 Ответ

0 голосов
/ 27 августа 2018

Вам понадобится пользовательский делегат и сделайте свой собственный рендеринг.Использование форматированного текста, к сожалению, не поддерживается из коробки.

...