[Qt-interest] QTreeView, proxy model and expandable state

Dmitry Baryshev ksquirrel.iv at gmail.com
Mon Apr 13 19:12:51 CEST 2009


2009/4/13 Dmitry Baryshev <ksquirrel.iv at gmail.com>:
> 2009/4/13 Scott Aron Bloom <Scott.Bloom at sabgroup.com>:
>> It will really depend on what you implemented in your filterAcceptsRows
>> method.
>>
>> Without seeing the guts of it, I have no idea how to help you.
>>
>> Scott
>>
>> -----Original Message-----
>> From: qt-interest-bounces at trolltech.com
>> [mailto:qt-interest-bounces at trolltech.com] On Behalf Of Dmitry Baryshev
>> Sent: Monday, April 13, 2009 8:26 AM
>> To: qt-interest at trolltech.com
>> Subject: [Qt-interest] QTreeView, proxy model and expandable state
>>
>> Hi.
>>
>> I use QTreeView+QFileSystemModel. It seems to work fine, all directory
>> items have expanable flag ("+" on the left side). Now I've added
>> QSortFilterProxyModel with only one reimplemented method - "bool
>> SortFilterProxyModel::filterAcceptsRow(int row, const QModelIndex
>> &parent) const". Now all directory items in QTreeView lost its
>> expandable state - no '+' elements.
>> QTreeView::setItemsExpandable(true) doesn't help. I don't understand
>> the logic why filtering affects expandable states? Could you please
>> help me with this strange problem? Thanks!
>>
>> --
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at trolltech.com
>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at trolltech.com
>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>
>
> In any case it doesn't work. For example:
>
> bool MySortFilterProxyModel::filterAcceptsRow(int row, const
> QModelIndex &parent) const
> {
>    return true;
> }
>
> --
>

Full source code to reproduce:

.h
--

#ifndef FLL_H
#define FLL_H

#include <QTreeView>

class fl : public QTreeView
{
    Q_OBJECT

    public:
        fl(QWidget *parent = 0);
};

#endif

.cpp
----

#include <QFileSystemModel>
#include <QSortFilterProxyModel>

#include "fl.h"

class SortFilterProxyModel : public QSortFilterProxyModel
{
    public:
        SortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
        {
            setFilterRegExp(".*");
        }

    protected:
        bool filterAcceptsRow(int /* row */, const QModelIndex &/*
parent */) const
        {
            return true;
        }
};

#define USE_PROXY_MODEL

fl::fl(QWidget *parent) : QTreeView(parent)
{
    QFileSystemModel *model;

    model = new QFileSystemModel;
    model->setResolveSymlinks(true);
    model->setNameFilterDisables(false);
    model->setReadOnly(true);

    SortFilterProxyModel *proxyModel;

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

#ifdef USE_PROXY_MODEL
    QModelIndex root =
proxyModel->mapFromSource(model->setRootPath(QDir::rootPath()));
    setModel(proxyModel);
#else
    QModelIndex root = model->setRootPath(QDir::rootPath());
    setModel(model);
#endif

    setRootIndex(root);
}

/*********************************/

define or undef USE_PROXY_MODEL to test two cases with and without proxy model.

Result:

1) without proxy model: http://img258.imageshack.us/img258/7271/fl1.png
2) with proxy model: http://img258.imageshack.us/img258/1606/fl2.png

The system is Debian Lenny with Qt 4.4.3.

Maybe it is a bug?

--




More information about the Qt-interest-old mailing list