#include "main.hpp" #include #include #include #include #include #include #include // Class MyFilterModel MyFilterModel::MyFilterModel( QObject* parent ) : QSortFilterProxyModel( parent ), mFilter( false ) { } MyFilterModel::~MyFilterModel( void ) { } void MyFilterModel::FilterElements( bool filter ) { mFilter = filter; invalidate( ); //invalidateFilter( ); } bool MyFilterModel::filterAcceptsColumn ( int source_column, const QModelIndex & source_parent ) const { return true; } bool MyFilterModel::filterAcceptsRow( int source_row, const QModelIndex& source_parent ) const { if ( !mFilter ) { return true; } return 0 == ( source_row & 1 ); } // Main static const unsigned int cNumRows = 22; static const unsigned int cNumCols = 10; int main( int argc, char** argv ) { int ret; { QApplication app( argc, argv ); // Setup the main window ui. QMainWindow* mainWindow = new QMainWindow( ); QWidget* centralWidget = new QWidget( mainWindow ); QVBoxLayout* layout = new QVBoxLayout( centralWidget ); QPushButton* button = new QPushButton( centralWidget ); button->setText( "Filter" ); button->setCheckable( true ); layout->addWidget( button ); QTreeView* tree = new QTreeView( mainWindow ); QStandardItemModel* model = new QStandardItemModel( cNumRows, cNumCols, mainWindow ); MyFilterModel* proxy = new MyFilterModel( centralWidget ); proxy->setSourceModel( model ); tree->setModel( proxy ); tree->setSelectionBehavior( QAbstractItemView::SelectRows ); tree->setSelectionMode( QAbstractItemView::ExtendedSelection ); layout->addWidget( tree ); // Populate the tree view. for ( unsigned int i = 0; i < cNumCols; i++ ) { QString s; s.sprintf( "Column %u", i ); model->setHeaderData( i, Qt::Horizontal, s ); } for ( unsigned int r = 0; r < cNumRows; r++ ) { for ( unsigned int c = 0; c < cNumCols; c++ ) { QString s; s.sprintf( "r:%u/c%u", r, c ); model->setData( model->index( r, c, QModelIndex( ) ), s ); } } proxy->invalidate( ); // Setup the button so that it filters when pressed. QObject::connect( button, SIGNAL( toggled( bool ) ), proxy, SLOT( FilterElements( bool ) ) ); // Run the main window. mainWindow->setCentralWidget( centralWidget ); mainWindow->show( ); ret = app.exec( ); delete mainWindow; } return ret; }