Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Real-time filtering using QSortFilterProxyModel
Forum Update on Monday, May 27th 2025

Real-time filtering using QSortFilterProxyModel

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 1.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    killerman
    wrote on 30 Apr 2015, 16:03 last edited by
    #1

    I have a QTableView and a model. This is my filtering function:

    void filter( QString data ){
        pxModel->setFilterRegExp( data );
    }
    

    It searches only first column but I want to search all 5 of them. How can I do that?

    I found this post:
    http://www.qtcentre.org/threads/24267-QSortFilterProxyModel-setFilterRegExp-for-more-than-1-column?p=141791#post141791

    I've tried reimplementing filterAcceptsRow(...) function but I get error :"m_columnPatterns was not declared in this scope"

    Is there an easier way ?

    1 Reply Last reply
    0
    • M Offline
      M Offline
      maximus
      wrote on 30 Apr 2015, 20:13 last edited by
      #2

      Have you created a new class inheriting QSortFilterProxyModel?

      That's what I did and I can filter multiple column with this code:

      proxyModel->setSortCaseSensitivity(Qt::CaseSensitive);
      
      qDebug() << "filterChanged inside Workout Page!";
      qDebug() << field << "value" << value;
      
      if (field == "name") {
          proxyModel->addFilterFixedString(0, value);
      }
      else if (field == "plan") {
          proxyModel->addFilterFixedString(1, value);
      }
      else if (field == "creator") {
          proxyModel->addFilterFixedString(2, value);
      }
      else if (field == "workoutType") {
          proxyModel->addFilterFixedString(3, value);
      }
      /// Reset filter
      else {
          for (int i=0; i<4; i++) {
              proxyModel->addFilterFixedString(i, "");
          }
      }
      
      proxyModel->invalidate();
      
      
      
          void SortFilterProxyModel::addFilterFixedString(qint32 column, const QString &pattern)
          {
              if(!m_columnPatterns.contains(column)) {
                  return;
              }
          
              m_columnPatterns[column] = pattern;
          
          }
      

      Free Indoor Cycling Software - https://maximumtrainer.com

      1 Reply Last reply
      0
      • K Offline
        K Offline
        killerman
        wrote on 1 May 2015, 10:11 last edited by killerman 5 Jan 2015, 10:13
        #3

        I have a problem. Wehen i change text in my QLineEdit (text I want to search) everything gets removed from TableView.

        SortFilterProxyModel.h:

        #ifndef SORTFILTERPROXYMODEL_H
        #define SORTFILTERPROXYMODEL_H
        
        #include <QObject>
        #include <QSortFilterProxyModel>
        
        class SortFilterProxyModel : public QSortFilterProxyModel
        {
            Q_OBJECT
        public:
            explicit SortFilterProxyModel(QObject *parent = 0);
            ~SortFilterProxyModel();
            void setFilterKeyColumns(const QList<qint32> &filterColumns);
            void addFilterFixedString(qint32 column, const QString &pattern);
        
        protected:
            bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const;
        
        private:
            QMap<qint32, QString> m_columnPatterns;
        };
        
        #endif // SORTFILTERPROXYMODEL_H
        

        SortFilterProxyModel.cpp:

        #include "sortfilterproxymodel.h"
        
        SortFilterProxyModel::SortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
        {
        }
        
        SortFilterProxyModel::~SortFilterProxyModel()
        {
        }
        
        void SortFilterProxyModel::setFilterKeyColumns(const QList<qint32> &filterColumns){
        m_columnPatterns.clear();
        
        foreach(qint32 column, filterColumns)
        m_columnPatterns.insert(column, QString());
        }
        
        void SortFilterProxyModel::addFilterFixedString(qint32 column, const QString &pattern){
        if(!m_columnPatterns.contains(column))
            return;
        
        m_columnPatterns[column] = pattern;
         }
        
        bool SortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent) const{
        if(m_columnPatterns.isEmpty())
            return true;
        
        bool ret = false;
        
        for(QMap<qint32, QString>::const_iterator iter = m_columnPatterns.constBegin();
        iter != m_columnPatterns.constEnd();
        ++iter)
        {
            QModelIndex index = sourceModel()->index(source_row, iter.key(), source_parent);
            ret = (index.data().toString() == iter.value());
        
            if(!ret)
                return ret;
        }
        
        return ret;
        }
        

        In app constructor:

        model = new QSqlRelationalTableModel(this);
        proxyModel = new SortFilterProxyModel(this);
        proxyModel->setSourceModel(model);
        ui->tableView->setModel(proxyModel);
        
        // Adding columns to filter
        QList<qint32> lista;
        lista.append(0);
        lista.append(1);
        lista.append(2);
        lista.append(3);
        lista.append(4);
        proxyModel->setFilterKeyColumns(lista);
        
        // connecting the slot
        connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(search(QString)));
        

        I've created slot to handle the search:

        void search( QString data ){
            for (int i=0; i<4; i++){
                pxModel->addFilterFixedString(i, data);
                pxModel->invalidate();
            }
        }
        

        Why it doesn't work ?

        Whole project:
        https://www.dropbox.com/sh/p9rfwc8za439wi5/AADryEvjDeOn30SCykSoTRYea?dl=0

        1 Reply Last reply
        0

        1/3

        30 Apr 2015, 16:03

        • Login

        • Login or register to search.
        1 out of 3
        • First post
          1/3
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved