Difference between revisions of "Filter Columns in a QFileSystemModel"

From Qt Wiki
Jump to: navigation, search
Line 1: Line 1:
[[Category:HowTo]]<br />[[Category:snippets]]
+
[[Category:HowTo]]
 +
[[Category:snippets]]
  
 
= How to Filter Columns in a QFileSystemModel =
 
= How to Filter Columns in a QFileSystemModel =
  
Sometimes one does not want to display all the columns of a &quot;QFileSystemModel&amp;quot;:http://doc.qt.nokia.com/stable/qfilesystemmodel.html, like discussed in &quot;this forum thread&amp;quot;:http://developer.qt.nokia.com/forums/viewthread/3114/.
+
Sometimes one does not want to display all the columns of a "QFileSystemModel":http://doc.qt.nokia.com/stable/qfilesystemmodel.html, like discussed in "this forum thread":http://developer.qt.nokia.com/forums/viewthread/3114/.
  
This can be achieved in two ways, either by hiding the columns in the view, by using a specialized proxy model. The easiest way is to hide the columns using the &lt;code&amp;gt;QHeaderView&amp;lt;/code&amp;gt;, but the alternative to subclass &quot;QSortFilterProxyModel&amp;quot;:http://doc.qt.nokia.com/stable/qsortfilterproxymodel.html and reimplement the &lt;code&amp;gt;filterAcceptsColumn()&lt;/code&amp;gt; method also works well.
+
This can be achieved in two ways, either by hiding the columns in the view, by using a specialized proxy model. The easiest way is to hide the columns using the <code>QHeaderView</code>, but the alternative to subclass "QSortFilterProxyModel":http://doc.qt.nokia.com/stable/qsortfilterproxymodel.html and reimplement the <code>filterAcceptsColumn()</code> method also works well.
  
 
== Column hiding using QHeaderView ==
 
== Column hiding using QHeaderView ==
  
All multi-column views provide access to a &quot;QHeaderView&amp;quot;:http://doc.qt.nokia.com/stable/qheaderview.html . This is the widget that provides the headers above the columns of data, and allows the user to resize those columns, or click the headers to trigger a sorting order. You can also use this widget to hide columns in your view.
+
All multi-column views provide access to a "QHeaderView":http://doc.qt.nokia.com/stable/qheaderview.html . This is the widget that provides the headers above the columns of data, and allows the user to resize those columns, or click the headers to trigger a sorting order. You can also use this widget to hide columns in your view.
  
<code><br />//hide the third and fourth column, note that the column numbers are 0-based<br />QHeaderView* hHeader = m_theTableview-&gt;horizontalHeader();<br />hHeader-&gt;hideSection(2);<br />hHeader-&gt;hideSection(3);<br /></code>
+
<code>
 +
//hide the third and fourth column, note that the column numbers are 0-based
 +
QHeaderView* hHeader = m_theTableview->horizontalHeader();
 +
hHeader->hideSection(2);
 +
hHeader->hideSection(3);
 +
</code>
  
 
The alternative method of using a custom proxy model is outlined below.
 
The alternative method of using a custom proxy model is outlined below.
Line 19: Line 25:
 
Be aware that the column count is 0-based and that it is hard coded.
 
Be aware that the column count is 0-based and that it is hard coded.
  
==== fsmproxy.h<br /><code><br />#include &lt;QSortFilterProxyModel&amp;gt; ====
+
==== fsmproxy.h
 +
<code>
 +
#include <QSortFilterProxyModel> ====
  
class FSMProxy : public QSortFilterProxyModel<br />{<br /> Q_OBJECT
+
class FSMProxy : public QSortFilterProxyModel
 +
{
 +
Q_OBJECT
  
public:<br /> FSMProxy(QObject *parent);
+
public:
 +
FSMProxy(QObject *parent);
  
protected:<br /> bool filterAcceptsColumn(int source_column, const QModelIndex &amp;source_parent) const;<br />};<br /></code>
+
protected:
 +
bool filterAcceptsColumn(int source_column, const QModelIndex &amp;source_parent) const;
 +
};
 +
</code>
  
==== fsmproxy.cpp<br /><code><br />FSMProxy::FSMProxy(QObject *parent)<br /> : QSortFilterProxyModel(parent)<br />{<br />} ====
+
==== fsmproxy.cpp
 +
<code>
 +
FSMProxy::FSMProxy(QObject *parent)
 +
: QSortFilterProxyModel(parent)
 +
{
 +
} ====
  
bool FSMProxy::filterAcceptsColumn(int source_column, const QModelIndex &amp;source_parent) const<br />{<br /> Q_UNUSED(source_parent)
+
bool FSMProxy::filterAcceptsColumn(int source_column, const QModelIndex &amp;source_parent) const
 +
{
 +
Q_UNUSED(source_parent)
  
    // adjust the columns you want to filter out here<br />    // return false for those that will be hidden<br /> if(source_column  2 || source_column  3)<br /> return false;<br /> return true;<br />}<br /></code>
+
    // adjust the columns you want to filter out here
 +
    // return false for those that will be hidden
 +
if(source_column  2 || source_column  3)
 +
return false;
 +
return true;
 +
}
 +
</code>
  
==== Usage<br /><code><br />    QFileSystemModel *fsm = new QFileSystemModel(this);<br />    FSMProxy *proxy = new FSMProxy(this);<br />    proxy-&gt;setSourceModel(fsm);<br />    treeView-&gt;setModel(proxy);<br /></code> ====
+
==== Usage
 +
<code>
 +
    QFileSystemModel *fsm = new QFileSystemModel(this);
 +
    FSMProxy *proxy = new FSMProxy(this);
 +
    proxy->setSourceModel(fsm);
 +
    treeView->setModel(proxy);
 +
</code> ====

Revision as of 10:14, 25 February 2015


How to Filter Columns in a QFileSystemModel

Sometimes one does not want to display all the columns of a "QFileSystemModel":http://doc.qt.nokia.com/stable/qfilesystemmodel.html, like discussed in "this forum thread":http://developer.qt.nokia.com/forums/viewthread/3114/.

This can be achieved in two ways, either by hiding the columns in the view, by using a specialized proxy model. The easiest way is to hide the columns using the QHeaderView, but the alternative to subclass "QSortFilterProxyModel":http://doc.qt.nokia.com/stable/qsortfilterproxymodel.html and reimplement the filterAcceptsColumn() method also works well.

Column hiding using QHeaderView

All multi-column views provide access to a "QHeaderView":http://doc.qt.nokia.com/stable/qheaderview.html . This is the widget that provides the headers above the columns of data, and allows the user to resize those columns, or click the headers to trigger a sorting order. You can also use this widget to hide columns in your view.

//hide the third and fourth column, note that the column numbers are 0-based QHeaderView* hHeader = m_theTableview->horizontalHeader(); hHeader->hideSection(2); hHeader->hideSection(3);

The alternative method of using a custom proxy model is outlined below.

Column hiding using QSortFilterProxyModel

Be aware that the column count is 0-based and that it is hard coded.

==== fsmproxy.h

  1. include <QSortFilterProxyModel> ====

class FSMProxy : public QSortFilterProxyModel {

Q_OBJECT

public:

FSMProxy(QObject *parent);

protected:

bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const;

};

==== fsmproxy.cpp FSMProxy::FSMProxy(QObject *parent)

: QSortFilterProxyModel(parent)

{ } ====

bool FSMProxy::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const {

Q_UNUSED(source_parent)

    // adjust the columns you want to filter out here     // return false for those that will be hidden

if(source_column  2 || source_column  3)
return false;
return true;

}

==== Usage     QFileSystemModel *fsm = new QFileSystemModel(this);     FSMProxy *proxy = new FSMProxy(this);     proxy->setSourceModel(fsm);     treeView->setModel(proxy); ====