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. filterAcceptsColumn work wrong in QSortFilterProxyModel

filterAcceptsColumn work wrong in QSortFilterProxyModel

Scheduled Pinned Locked Moved Solved General and Desktop
qt5qsortfilterprox
6 Posts 3 Posters 834 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.
  • Z Offline
    Z Offline
    zloi_templar
    wrote on last edited by
    #1

    Hello, i have some trouble with filter
    I have 25 columns, need to hide some columns by filter

    bool ProxyModelSM::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const
    {
        if(uncheckedColumns.contains(source_column))
        {
            qDebug()<<sourceModel()->headerData(source_column, Qt::Horizontal);
            return false;
        }
        return true;
    }
    

    where uncheckedColumns - list with hided columns (it's numbers in table)
    But filter always hide last columns
    If i send to filter next list (3,7), it's hide 24,25 columns (2 last).
    qDebug print correct header name, but hide last columns
    What i did wrong?

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #5

      just delete ProxyModelSM::headerData completely. The default implementation already does what you want

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      Z 1 Reply Last reply
      2
      • Christian EhrlicherC Online
        Christian EhrlicherC Online
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on last edited by
        #2

        @zloi_templar said in filterAcceptsColumn work wrong in QSortFilterProxyModel:

        uncheckedColumns

        Are you sure you container contains the source columns and not the proxy columns? I would guess not. Please show use how you fill this container.

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        1 Reply Last reply
        2
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #3

          Can't reproduce.

          Could you test this minimal example?

          #include <QApplication>
          #include <QStandardItemModel>
          #include <QSortFilterProxyModel>
          #include <QTableView>
          
          class CustomProxy : public QSortFilterProxyModel{
              Q_DISABLE_COPY(CustomProxy)
          public:
              using QSortFilterProxyModel::QSortFilterProxyModel;
              const QVector<int>& uncheckedColumns() const{return m_uncheckedColumns;}
              void setUncheckedColumns(const QVector<int> &uncheckedColumns){m_uncheckedColumns = uncheckedColumns;}
          protected:
              bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const override{
                  if(source_parent.isValid())
                      return true;
                  return !m_uncheckedColumns.contains(source_column);
              }
          private:
              QVector<int> m_uncheckedColumns;
          };
          
          int main(int argc, char *argv[])
          {
              QApplication app(argc,argv);
              QTableView view;
              QAbstractItemModel* srcModel = new QStandardItemModel(&view);
              srcModel->insertRows(0,100);
              srcModel->insertColumns(0,25);
              for(int i=0;i<srcModel->rowCount();++i){
                  for(int j=0;j<srcModel->columnCount();++j){
                      srcModel->setData(srcModel->index(i,j),QStringLiteral("%1,%2").arg(i).arg(j));
                  }
              }
              CustomProxy* proxyModel = new CustomProxy(&view);
              proxyModel->setSourceModel(srcModel);
              proxyModel->setUncheckedColumns({3,7});
              view.setModel(proxyModel);
              view.show();
              return app.exec();
          }
          

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          Z 1 Reply Last reply
          3
          • VRoninV VRonin

            Can't reproduce.

            Could you test this minimal example?

            #include <QApplication>
            #include <QStandardItemModel>
            #include <QSortFilterProxyModel>
            #include <QTableView>
            
            class CustomProxy : public QSortFilterProxyModel{
                Q_DISABLE_COPY(CustomProxy)
            public:
                using QSortFilterProxyModel::QSortFilterProxyModel;
                const QVector<int>& uncheckedColumns() const{return m_uncheckedColumns;}
                void setUncheckedColumns(const QVector<int> &uncheckedColumns){m_uncheckedColumns = uncheckedColumns;}
            protected:
                bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const override{
                    if(source_parent.isValid())
                        return true;
                    return !m_uncheckedColumns.contains(source_column);
                }
            private:
                QVector<int> m_uncheckedColumns;
            };
            
            int main(int argc, char *argv[])
            {
                QApplication app(argc,argv);
                QTableView view;
                QAbstractItemModel* srcModel = new QStandardItemModel(&view);
                srcModel->insertRows(0,100);
                srcModel->insertColumns(0,25);
                for(int i=0;i<srcModel->rowCount();++i){
                    for(int j=0;j<srcModel->columnCount();++j){
                        srcModel->setData(srcModel->index(i,j),QStringLiteral("%1,%2").arg(i).arg(j));
                    }
                }
                CustomProxy* proxyModel = new CustomProxy(&view);
                proxyModel->setSourceModel(srcModel);
                proxyModel->setUncheckedColumns({3,7});
                view.setModel(proxyModel);
                view.show();
                return app.exec();
            }
            
            Z Offline
            Z Offline
            zloi_templar
            wrote on last edited by zloi_templar
            #4

            @VRonin, @Christian-Ehrlicher sorry, my bad.
            I tested again and saw, that programm works, it's hide correct data column, but draw old header, because i write it manually:

            tbSC = new tableSM(this);
            proxySM = new ProxyModelSM(tbSC);
            mdlSC = new modelSM(proxySM);
            
            QVariant modelSM::headerData(int section, Qt::Orientation orientation, int role) const
            {
                if(role!= Qt::DisplayRole)
                    return QVariant();
            
                if (orientation == Qt::Horizontal)
                {
                    switch (section)
                    {
                        case 0:
                            return tr("ID");
                        case 1:
                            return tr("Date");
                        case 2:
                            return tr("Status");
                        case 3:
                            return tr("Street");
                        case 4:
                            return tr("Home");
                        case 5:
                            return tr("Room");
                        case 6:
                            return tr("People");
                        case 7:
                            return tr("Animals");
            etc
            
            QVariant ProxyModelSM::headerData(int section, Qt::Orientation orientation, int role) const
             {
                   return sourceModel()->headerData(section, orientation, role);
             };
            

            how can i fix it?

            P.S. Fix it

            QVariant ProxyModelSM::headerData(int section, Qt::Orientation orientation, int role) const
                {
                    if(orientation==Qt::Horizontal)
                        return sourceModel()->headerData(mapToSource(index(0, section)).column(), orientation, role);
                    else
                        return sourceModel()->headerData(section, orientation, role);
                };
            
            1 Reply Last reply
            0
            • VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #5

              just delete ProxyModelSM::headerData completely. The default implementation already does what you want

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              Z 1 Reply Last reply
              2
              • VRoninV VRonin

                just delete ProxyModelSM::headerData completely. The default implementation already does what you want

                Z Offline
                Z Offline
                zloi_templar
                wrote on last edited by
                #6

                @VRonin
                wow, it's really work. Thank you

                1 Reply Last reply
                0

                • Login

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