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

Dmitry Baryshev ksquirrel.iv at gmail.com
Mon Apr 13 19:26:21 CEST 2009


2009/4/13 Scott Aron Bloom <Scott.Bloom at sabgroup.com>:
>
>
>> -----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 10:13 AM
>> To: qtInterest
>> Subject: Re: [Qt-interest] QTreeView, proxy model and expandable state
>>
>> 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?
>>
>> --
>>
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at trolltech.com
>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>
> Its probably your setFilterRegExp call...  Try turning that off, and leaving the filterAcceptsRow... See what happens
>
> Scott
>
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>

I removed setFilterRegExp() but nothing changed... Even more - if I
remove filterAcceptsRow() at all nothing changes again - items are
still not expandable. And even more... :) If I try to set expandable
flag by hand:

....

    setRootIndex(root);

    setRootIsDecorated(true);
    setItemsExpandable(true);
    setExpandsOnDoubleClick(true);
}

it still doesn't work for some reason... Double clicking doesn't open
an item too. Qt 4.5 has the same result as 4.4.3 :(

-- 
Regards, Krasu.




More information about the Qt-interest-old mailing list