Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Август 29, 2016, 21:20



Название: proxymodel результат фильтрации
Отправлено: demaker от Август 29, 2016, 21:20
Есть модель. Есть proxymodel модель в которой реализован фильтр filterAcceptsRow.
Скажите как результат фильтрации выделить цветом или шрифт изменить.
Т.е изначально ничего не выделяем, а потом после обработки
выделили желтым цветом ну или шрифт шпоменяли.




Название: Re: proxymodel результат фильтрации
Отправлено: Old от Август 29, 2016, 21:30
Есть модель. Есть proxymodel модель в которой реализован фильтр filterAcceptsRow.
Скажите как результат фильтрации выделить цветом или шрифт изменить.
Т.е изначально ничего не выделяем, а потом после обработки
выделили желтым цветом ну или шрифт шпоменяли.
Переопределите метод data прокси-модели и возвращайте нужные значения для ролей возвраьта цвета или фонта.


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 29, 2016, 22:08
Есть модель. Есть proxymodel модель в которой реализован фильтр filterAcceptsRow.
Скажите как результат фильтрации выделить цветом или шрифт изменить.
Т.е изначально ничего не выделяем, а потом после обработки
выделили желтым цветом ну или шрифт шпоменяли.
Переопределите метод data прокси-модели и возвращайте нужные значения для ролей возвраьта цвета или фонта.

Ну я так и делал изначально.
Только мне сразу выделили все желтым цветом
Код
C++ (Qt)
...
if(role==Qt::BackGroundColorRole)
   return QBrush("yellow")
...
 
???
Я имею ввиду , что результат работы фильтра выделялся цветом.
Или я может что-то не так делаю??? ???


Название: Re: proxymodel результат фильтрации
Отправлено: Old от Август 29, 2016, 22:11
Или я может что-то не так делаю??? ???
Ну так вам нужно вначале проверить "отфильтровался" запрашиваемый row или нет, и вернуть цвет в зависимости от этого.


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 29, 2016, 22:26
Или я может что-то не так делаю??? ???
Ну так вам нужно вначале проверить "отфильтровался" запрашиваемый row или нет, и вернуть цвет в зависимости от этого.


Я не знаю как проверить  :-[


Название: Re: proxymodel результат фильтрации
Отправлено: Old от Август 29, 2016, 22:31
Вы filterAcceptsRow как реализовали?


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 29, 2016, 22:49
Вы filterAcceptsRow как реализовали?

Код
C++ (Qt)
 
bool filterAcceptsRow(int source_row,  const QModelIndex &source_parent)
{
   QModelIndex  index = sourceModel()->index(source_row,1,source_parent);
   QVariant value = sourceModel()->data(index,Qt::DisplayRole);
   if(value.isValid){
       int date = value.toInt();
       return  date == filter;
   }
 
   return  QSortFilterProxyModel::filterAcceptsRow(source_row,source_parent);
}
 
 


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 29, 2016, 23:41
Есть
Код:
void setFilterRole(int )
int filterRоle()
Только как они помогут?


Название: Re: proxymodel результат фильтрации
Отправлено: kamre от Август 30, 2016, 07:43
Вот, меня тоже подобное всегда интересовало при работе с моделями и фильтрацией.

Как сделать выделение найденного после фильтрации подобно тому как на этой картинке:


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 30, 2016, 09:34
Скажите так как можно сделать ???


Название: Re: proxymodel результат фильтрации
Отправлено: gil9red от Август 30, 2016, 09:59
Вот, меня тоже подобное всегда интересовало при работе с моделями и фильтрацией.

Как сделать выделение найденного после фильтрации подобно тому как на этой картинке:


Тут, или с делегатом работать -- в методе рисования рисовать выделение на тексте
Или аналогично в методе рисования view


Название: Re: proxymodel результат фильтрации
Отправлено: Old от Август 30, 2016, 10:23
Я не знаю как проверить  :-[

Код
C++ (Qt)
QVariant ProxyModel::data( const QModelIndex &index, int role ) const
{
   ...
   if( role==Qt::BackGroundColorRole )
   {
       const QModelIndex src = mapToSource( index );
       if( filterAcceptsRow( src.row(), QModelIndex() ) )
           return QBrush("yellow");
   }
 
   return QVariant();
}
 


Название: Re: proxymodel результат фильтрации
Отправлено: kamre от Август 30, 2016, 11:06
Тут, или с делегатом работать -- в методе рисования рисовать выделение на тексте
Или аналогично в методе рисования view
А примера готового нет для такой фильтрации в дереве? А то у меня даже просто фильтрация в дереве без подсветки найденного не работает. Фильтр для дерева тупо работает: оставляет только те узлы в дереве, у которых весь путь до корня под фильтр попадает.


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 30, 2016, 11:16
Я не знаю как проверить  :-[

Код
C++ (Qt)
QVariant ProxyModel::data( const QModelIndex &index, int role ) const
{
   ...
   if( role==Qt::BackGroundColorRole )
   {
       const QModelIndex src = mapToSource( index );
       if( filterAcceptsRow( src.row(), QModelIndex() ) )
           return QBrush("yellow");
   }
 
   return QVariant();
}
 

Но мне нужно - что если фильтр пустой отображать всю таблицу без выделения цветом.
А после фильтрации то да.
Получается так что изначально у меня таблица тоже вся выделена


Название: Re: proxymodel результат фильтрации
Отправлено: Old от Август 30, 2016, 11:25
Но мне нужно - что если фильтр пустой отображать всю таблицу без выделения цветом.

Ну вы можете проверять попадает ли строка под фильтр, тем же самым кодом, что у вас в filterAcceptsRow, но до установки фильтра.


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 30, 2016, 11:31
Но мне нужно - что если фильтр пустой отображать всю таблицу без выделения цветом.
Ну вы можете проверять попадает ли строка под фильтр, тем же самым кодом, что у вас в filterAcceptsRow, но до установки фильтра.

Да я проверяю делаю так
Код
C++ (Qt)
bool DataBaseFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{  
   int column = filterKeyColumn();
   if(column == 0){
       if(strFilter_0.isEmpty()){
           return true; // если здесь true не будет то я всю таблицу не увижу !!!
       }
       else{
           QModelIndex index = sourceModel()->index(source_row,column,source_parent);
           QVariant value = sourceModel()->data(index,Qt::DisplayRole);
           if(value.isValid()){
               int date = value.toInt();
               int filter = strFilter_0.toInt();
               return date == filter;
           }
       }
   }
}
 
bool DataBaseFilterModel::updateFilterColumn_0(QString string)
{
  strFilter_0.clear();
  strFilter_0.append(string);
  setFilterKeyColumn(0);
 
  invalidateFilter();
}
 


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 31, 2016, 10:00
Сделал так , Спасибо Old
Код
C++ (Qt)
DataBaseFilterModel::DataBaseFilterModel(QObject *parent) :
   QSortFilterProxyModel(parent)
{
   strFilter_1.clear();
}
 
DataBaseFilterModel::~DataBaseFilterModel()
{
}
 
QVariant DataBaseFilterModel::data(const QModelIndex &index, int role) const
{
   if(role == Qt::BackgroundColorRole){
       const QModelIndex src = mapToSource(index);        
       if( !strFilter_1.isEmpty() && filterAcceptsRow(src.row(),QModelIndex()))
           return QBrush("yellow");
   }
 
   return QSortFilterProxyModel::data(index,role);
}
 
bool DataBaseFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
   int column = filterKeyColumn();
   if(column == 1){
       if(strFilter_1.isEmpty()){
           return true;
       }
       else{
           QModelIndex index = sourceModel()->index(source_row,column,source_parent);
           QVariant value = sourceModel()->data(index,Qt::DisplayRole);
           if(value.isValid()){
               int date = value.toInt();
               int filter = strFilter_1.toInt();
               return date == filter;
           }
       }
    }
 
   return QSortFilterProxyModel::filterAcceptsRow(source_row,source_parent);
}
 
void DataBaseFilterModel::updateFilterColumn_1(QString string)
{
   strFilter_1.clear();
   strFilter_1.append(string);    
   setFilterKeyColumn(1);
   invalidateFilter();
}
 


Название: Re: proxymodel результат фильтрации
Отправлено: demaker от Август 31, 2016, 21:50
Скажите. А фильтрацию или сортировку можно вынести в отдельный
поток. Ну например с помощью QtConCurrent.