Russian Qt Forum
Ноябрь 23, 2024, 03:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: прокси из QAbstractProxyModel  (Прочитано 10123 раз)
unkeep
Гость
« : Октябрь 22, 2013, 15:20 »

сделал свою проксю из базового класса QAbstractProxyModel и передал её виджету, но он показывает только хедер, а данные не показывает. Причём data возвращает правильные значения. А во вьюхе пусто..
 вот код,  прокси просто вызывает методы источника, без преобразований. Индексы тоже совпадают
 
 .h
Код
C++ (Qt)
class COMMONS_USAGE AbstractSearchProxyModel : public QAbstractProxyModel
{
   Q_OBJECT
public:
   explicit AbstractSearchProxyModel(QObject *parent = 0);
 
   QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
   QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;
   QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
   int rowCount(const QModelIndex &parent = QModelIndex()) const;
   int columnCount(const QModelIndex &parent = QModelIndex()) const;
   QModelIndex parent(const QModelIndex &child) const;
 
};

.cpp
Код
C++ (Qt)
AbstractSearchProxyModel::AbstractSearchProxyModel(QObject *parent) :
   QAbstractProxyModel(parent)
{
}
 
 
QModelIndex AbstractSearchProxyModel::mapToSource(const QModelIndex &proxyIndex) const
{
   return proxyIndex;
}
 
QModelIndex AbstractSearchProxyModel::mapFromSource(const QModelIndex &sourceIndex) const
{
   return sourceIndex;
}
 
QModelIndex AbstractSearchProxyModel::index(int row, int column, const QModelIndex &parent) const
{
   return mapFromSource(sourceModel()->index(row,column,parent));
}
 
int AbstractSearchProxyModel::rowCount(const QModelIndex &parent) const
{
   return sourceModel()->rowCount(mapToSource(parent));
}
 
int AbstractSearchProxyModel::columnCount(const QModelIndex &parent) const
{
   return sourceModel()->columnCount(mapToSource(parent));
}
 
QModelIndex AbstractSearchProxyModel::parent(const QModelIndex &child) const
{
   return mapFromSource(sourceModel()->parent(child));
}
Записан
VPS
Гость
« Ответ #1 : Октябрь 22, 2013, 19:50 »

Попробуйте так.
Записан
unkeep
Гость
« Ответ #2 : Октябрь 23, 2013, 10:48 »

Попробуйте так.

попробовал, данные показались. Но при попытке развернуть узел вылетает.

заметил что тут у вас нету mapToSorce для parent/child
Код
C++ (Qt)
QModelIndex MyProxyModel::index(int row, int column, const QModelIndex &parent) const
{
return mapFromSource(sourceModel()->index(row, column, parent));
}
 
QModelIndex MyProxyModel::parent(const QModelIndex &child) const
{
return mapFromSource(sourceModel()->parent(child));
}

однако, когда добавил, то вообще запускаться перестало.

странно, я вообще думал раз сортировки и фильтрации нет, то индекс  из другой модели должен работать(row/column/parent же одинаковые)
Записан
unkeep
Гость
« Ответ #3 : Октябрь 23, 2013, 10:58 »

в общем оставил index(), parent() как у вас(объясните почему так, по логике в исходную модель передаётся  чужой индекс)
А ошибка была тут:
Код
C++ (Qt)
QModelIndex MyProxyModel::mapFromSource(const QModelIndex &sourceIndex) const
{
if(!sourceIndex.isValid())
{
return QModelIndex();
}
 
return createIndex(sourceIndex.row(), sourceIndex.column(), 0);
}

а должно быть так:
Код
C++ (Qt)
return createIndex(sourceIndex.row(), sourceIndex.column(), sourceIndex.internalPointer());
Записан
mutineer
Гость
« Ответ #4 : Октябрь 23, 2013, 11:00 »

В индексе кроме строки и столбца содержится еще и указатель на модель, которая этот индекс породила. Поэтому в твоей первой версии индекс указывал не на ту модель
Записан
unkeep
Гость
« Ответ #5 : Октябрь 23, 2013, 11:37 »

хорошо, теперь в качестве источника для этой прокси(она пока ничего не делает, тупо дёргает источник) ставлю экземпляр QSortFilterProxyModel. Данные показываются, но при развороте узла - вылетает не с тем индексом.( QSortFilterProxyModel: index from wrong model passed to mapToSource)

почему так происходит?
какая разница что я подсунул вместо источника? ну отсортировались данные в источнике, самая внешняя прокся только передаёт эти данные в том же порядке что и в источнике...
Записан
mutineer
Гость
« Ответ #6 : Октябрь 23, 2013, 11:49 »

тебе вообще надо mapToSource переопределять? Для обычной сортировочно-фильтрующей модели это не требуется
Записан
unkeep
Гость
« Ответ #7 : Октябрь 23, 2013, 11:52 »

тебе вообще надо mapToSource переопределять? Для обычной сортировочно-фильтрующей модели это не требуется

я от QAbstractProxyModel наследовался, там mapToSource без реализации.


а вообще цель таккая:
есть исходная модель
есть модель для сортировки (наследуюсь от QSortFilterProxyModel и переопределяю там filterAcceptRow)
и есть модель для поиска :QAbstractProxyModel(в ней будет переопределен метод data для подсветки индексов попадающих в результаты поиска), в неё вкладываю отсортированную прокси-модель

модель для поиска передаю в QTreeView а также в свой виджет для поиска
может я что-то не так мудрю?
« Последнее редактирование: Октябрь 23, 2013, 12:00 от unkeep » Записан
VPS
Гость
« Ответ #8 : Октябрь 23, 2013, 14:12 »

Не совсем понятно, Вы хотите выделить строки в представлении, которые соответствуют критерию поиска?
Записан
unkeep
Гость
« Ответ #9 : Октябрь 23, 2013, 14:44 »

Не совсем понятно, Вы хотите выделить строки в представлении, которые соответствуют критерию поиска?
да. и кроме этого будет ещё навигация след\предыд.  по результатам поиска(то есть в представлении результаты выделяются одним цветом, а текущий результат другим).
« Последнее редактирование: Октябрь 23, 2013, 14:51 от unkeep » Записан
VPS
Гость
« Ответ #10 : Октябрь 23, 2013, 14:59 »

По моему, для выделения элементов в отсортированном списке, которые соответствуют критериям поиска можно воспользоваться обычной "QSortFilterProxyModel" и "tableView->selectionModel()"...

П.С.: т.е. оставить одну модель, которую вы используете для сортировки... Чего то я запутался... Улыбающийся
« Последнее редактирование: Октябрь 23, 2013, 15:03 от vps » Записан
unkeep
Гость
« Ответ #11 : Октябрь 23, 2013, 15:18 »

можно конечно одной проксёй обойтись и в ней всё сделать. но я хотел разнести ответственности по классам. Уже склоняюсь оставить эту затею...

 
Записан
VPS
Гость
« Ответ #12 : Октябрь 24, 2013, 13:52 »

Посмотрите здесь пример создания пользовательской модели, унаследованной от QAbctractProxyModel.
Может пригодится.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.254 секунд. Запросов: 20.