Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Kolobok от Июнь 10, 2008, 22:32



Название: Model и две View
Отправлено: 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 нужны только папки. Но если я к модели прикручиваю фильтр, то это действует на обе вьюшки. Если беру две модели, то при клике возбуждается исключение. Во  вьюшках фильтры я не нашел. Можно ли это как-то просто сделать?


Название: Re: Model и две View
Отправлено: lit-uriy от Июнь 10, 2008, 22:50
попробуй дерево через промежуточную модель (Proxy модель (http://crossplatform.ru/documentation/qtdoc4.3/model-view-proxy-models.php)) к основной подключать, а в промежуточной модели задать фильтр


Название: Re: Model и две View
Отправлено: Kolobok от Июнь 11, 2008, 06:54
попробуй дерево через промежуточную модель (Proxy модель (http://crossplatform.ru/documentation/qtdoc4.3/model-view-proxy-models.php)) к основной подключать, а в промежуточной модели задать фильтр

Это я тоже пробовал. При клике по папке в дереве возбуждается исключение и ругается, что модель должна быть одна и та же.


Название: Re: Model и две View
Отправлено: lit-uriy от Июнь 11, 2008, 08:43
значит что-то ты не так пробывал, выясняй что именно. На то она и прокси-модель, иначеб ее троли не делали.


Название: Re: Model и две View
Отправлено: Kolobok от Июнь 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 & ) ) );

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

Так я вроде этот топик для того и открыл, чтобы выяснить.


Название: Re: Model и две View
Отправлено: lit-uriy от Июнь 11, 2008, 10:22
ui.listView->setModel(proxyModel);   
ui.treeView->setModel(model);

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


Название: Re: Model и две View
Отправлено: Kolobok от Июнь 11, 2008, 10:42
Это без разницы, что куда цеплять. Вьюшки хотят с одного зкземпляра модели кормиться.


Название: Re: Model и две View
Отправлено: Alex03 от Июнь 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 )


Название: Re: Model и две View
Отправлено: Kolobok от Июнь 11, 2008, 14:59
ДУмаю что тут индекс из одной модели в другую передаётся, пользуйте
QModelIndex QSortFilterProxyModel::mapFromSource ( const QModelIndex & sourceIndex )
QModelIndex QSortFilterProxyModel::mapToSource ( const QModelIndex & proxyIndex )

Спасибо, это помогло. Но в QSortFilterProxyModel я не знаю, как прикрутить фильтр QDir::AllDirs | QDir::NoDotAndDotDot.


Название: Re: Model и две View
Отправлено: Kolobok от Июнь 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 ) );
}