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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Model и две View  (Прочитано 7882 раз)
Kolobok
Гость
« : Июнь 10, 2008, 22:32 »

Здравствуйте,

у меня в программе есть QTreeView и QListView для отображения файловой системы.

Код:
QDirModel *model = new QDirModel;
QTreeView *tree = new QTreeView;
QListView *list = new QListView;
tree->setModel( model );
list->setModel( model );
connect( tree, SIGNAL( clicked( const QModelIndex & ) ), list, SLOT( setRootIndex( const QModelIndex & ) ) );

При клике на папке в tree, ее содержимое появляется в list. Проблема в том, что мне в tree нужны только папки. Но если я к модели прикручиваю фильтр, то это действует на обе вьюшки. Если беру две модели, то при клике возбуждается исключение. Во  вьюшках фильтры я не нашел. Можно ли это как-то просто сделать?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июнь 10, 2008, 22:50 »

попробуй дерево через промежуточную модель (Proxy модель) к основной подключать, а в промежуточной модели задать фильтр
« Последнее редактирование: Июнь 10, 2008, 22:52 от lit-uriy » Записан

Юра.
Kolobok
Гость
« Ответ #2 : Июнь 11, 2008, 06:54 »

попробуй дерево через промежуточную модель (Proxy модель) к основной подключать, а в промежуточной модели задать фильтр

Это я тоже пробовал. При клике по папке в дереве возбуждается исключение и ругается, что модель должна быть одна и та же.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июнь 11, 2008, 08:43 »

значит что-то ты не так пробывал, выясняй что именно. На то она и прокси-модель, иначеб ее троли не делали.
Записан

Юра.
Kolobok
Гость
« Ответ #4 : Июнь 11, 2008, 09:41 »

Я вот так делал

Код:
QDirModel *model = new QDirModel;

proxyModel = new QSortFilterProxyModel;
proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(model);

ui.listView->setModel(proxyModel);
ui.treeView->setModel(model);

connect( ui.treeView, SIGNAL( clicked( const QModelIndex & ) ), ui.listView, SLOT( setRootIndex( const QModelIndex & ) ) );

значит что-то ты не так пробывал, выясняй что именно.

Так я вроде этот топик для того и открыл, чтобы выяснить.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июнь 11, 2008, 10:22 »

ui.listView->setModel(proxyModel);   
ui.treeView->setModel(model);

если тебе надо фильтр в дереве, к нему прокси и цепляй а не к списку. И в проксе настрой фильтр. А Список пусть с основной модели кормится.
Записан

Юра.
Kolobok
Гость
« Ответ #6 : Июнь 11, 2008, 10:42 »

Это без разницы, что куда цеплять. Вьюшки хотят с одного зкземпляра модели кормиться.
Записан
Alex03
Гость
« Ответ #7 : Июнь 11, 2008, 11:40 »

Я вот так делал
Код:
...
connect( ui.treeView, SIGNAL( clicked( const QModelIndex & ) ), ui.listView, SLOT( setRootIndex( const QModelIndex & ) ) );
ДУмаю что тут индекс из одной модели в другую передаётся, пользуйте
QModelIndex QSortFilterProxyModel::mapFromSource ( const QModelIndex & sourceIndex )
QModelIndex QSortFilterProxyModel::mapToSource ( const QModelIndex & proxyIndex )
Записан
Kolobok
Гость
« Ответ #8 : Июнь 11, 2008, 14:59 »

ДУмаю что тут индекс из одной модели в другую передаётся, пользуйте
QModelIndex QSortFilterProxyModel::mapFromSource ( const QModelIndex & sourceIndex )
QModelIndex QSortFilterProxyModel::mapToSource ( const QModelIndex & proxyIndex )

Спасибо, это помогло. Но в QSortFilterProxyModel я не знаю, как прикрутить фильтр QDir::AllDirs | QDir::NoDotAndDotDot.
Записан
Kolobok
Гость
« Ответ #9 : Июнь 12, 2008, 14:45 »

Ничего не придумал с QSortFilterProxyModel, сделал с двумя моделями.

Код:
	treeModel = new QDirModel;
treeModel->setFilter( QDir::AllDirs | QDir::NoDotAndDotDot );

ui.treeView->setModel( treeModel );
ui.treeView->setColumnHidden( 1, true );
ui.treeView->setColumnHidden( 2, true );
ui.treeView->setColumnHidden( 3, true );

listModel = new QDirModel;
ui.listView->setModel( listModel );

void File::setRootIndex( const QModelIndex & index ) {
QString path = treeModel->filePath( index );
ui.listView->setRootIndex( listModel->index( path ) );
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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