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. What's the best way to find a ID from one QSortFilterProxyModel in another QSortFilerProxyModel?
Qt 6.11 is out! See what's new in the release blog

What's the best way to find a ID from one QSortFilterProxyModel in another QSortFilerProxyModel?

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 5 Posters 6.2k Views 1 Watching
  • 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #13

    Call setData with the index you got and whatever data you want to put there.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #14

      @SGaist

      I already tried that, but when I then add the mSynonymProxyModel to the QListView again, all the data from my ProxyModel is displayed and not just the one from the QModelIndexList. Do I need to do anything else? My code looks like this:

          foreach(QModelIndex myIndex, list){
              auto test = myIndex.siblingAtColumn(1).data(); //only for debuging
              mSynonymProxyModel->setData(myIndex, myIndex.data());
          }
      
      ui->synonymList->setModel(mSynonymProxyModel);
      
      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #15

        Sorry, I misunderstood your intentions.

        As @JonB already wrote, you would need to build a new model with the match result data.

        Wasn't the proxy supposed to be the model to feed the synonym view ?

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • JonBJ JonB

          @Gabber
          You never really replied to @eyllanesc's suggestion. If all you want is to get the list of indexes in a model for a value you could use that.

          For mine we are assuming you actually want to filter a model for a particular value in a particular field. You just need to write the desired filterAcceptsRow() implementation in a subclass, and have the outside world tell it which value you want to filter on. So you will want something like the following (you can tidy it):

          class SortFilterByIdProxyModel : QSortFilterProxyModel
          {
          private:
              const int idColumnNumber = 0;
              int idFilterValue = -1;
          
          public:
              void setIdFilterValue(int id)
              {
                  if (idFilterValue != id)
                  {
                      idFilterValue = id;
                      emit invalidateFilter();
                  }
              }
          
              bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
              {
                  Q_UNUSED(source_parent);    // only tree models use parents, not flat models
                  int id = sourceModel()->index(source_row, idColumnNumber).data().toInt();    // get the ID column's value in the source model's source row
                  return (id == idFilterValue);    // row accepted iff its id is the desired idFilterValue
              }
          }
          
          // Outside world
          sortFilterByIdProxyModel->setIdFilterValue(valueDesiredFromOtherModel);
          
          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by JonB
          #16

          @JonB said in What's the best way to find a ID from one QSortFilterProxyModel in another QSortFilerProxyModel?:

          @Gabber
          You never really replied to @eyllanesc's suggestion. If all you want is to get the list of indexes in a model for a value you could use that.
          For mine we are assuming you actually want to filter a model for a particular value in a particular field

          It seems to me using match() is not what you are looking to do here. Given that you do want to filter, and you had that way working earlier, I don't think you're pursuing anything useful.

          1 Reply Last reply
          0
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #17
            This post is deleted!
            1 Reply Last reply
            0
            • ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #18

              @JonB
              Your code works very well, thank you! I have one more question though: Is there a nicer way to filter by a specific ID or output all records? My code for this looks like this. Of course I always have to setFilterId(-1) which I don't like so much.

              void FungusSortFilterProxyModel::setIdFilter(const int &id)
              {
                  if(mIdFilterValue != id)
                  {
                      mIdFilterValue = id;
                      emit invalidateFilter();
                  }
              }
              
              bool FungusSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
              {
                  if(mIdFilterValue == -1){
                      return true;
                  } else {
                      Q_UNUSED(source_parent);
                      const int id = sourceModel()->index(source_row, mIdColumNumber).data().toInt();
                      return (id == mIdFilterValue);
                  }
              }
              
              JonBJ 1 Reply Last reply
              0
              • ? A Former User

                @JonB
                Your code works very well, thank you! I have one more question though: Is there a nicer way to filter by a specific ID or output all records? My code for this looks like this. Of course I always have to setFilterId(-1) which I don't like so much.

                void FungusSortFilterProxyModel::setIdFilter(const int &id)
                {
                    if(mIdFilterValue != id)
                    {
                        mIdFilterValue = id;
                        emit invalidateFilter();
                    }
                }
                
                bool FungusSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
                {
                    if(mIdFilterValue == -1){
                        return true;
                    } else {
                        Q_UNUSED(source_parent);
                        const int id = sourceModel()->index(source_row, mIdColumNumber).data().toInt();
                        return (id == mIdFilterValue);
                    }
                }
                
                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by
                #19

                @Gabber said in What's the best way to find a ID from one QSortFilterProxyModel in another QSortFilerProxyModel?:

                Is there a nicer way to filter by a specific ID or output all records?
                Of course I always have to setFilterId(-1) which I don't like so much.

                I don't know what you are looking for/what is wrong with what you have/what you would rather have?! What is the objection? If there is a valid mIdFilterValue you compare it against each row, but if it is invalid you don't bother and just return true. Seems fine to me?

                1 Reply Last reply
                0
                • ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by
                  #20

                  @JonB

                  I just wanted to know if there is a programming possibility to implement filterAcceptsRow in such a way that all records are always output and only when I call setIdFilter(id), it is filtered by this ID. After that all records should be used again automatically. If this is too complex or not possible then I have to work with setIdFilter(-1).

                  JonBJ 1 Reply Last reply
                  0
                  • ? A Former User

                    @JonB

                    I just wanted to know if there is a programming possibility to implement filterAcceptsRow in such a way that all records are always output and only when I call setIdFilter(id), it is filtered by this ID. After that all records should be used again automatically. If this is too complex or not possible then I have to work with setIdFilter(-1).

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #21

                    @Gabber
                    That is effectively what it is already doing: setting or not setting filter ID to -1 is how to test "only when I call setIdFilter(id), it is filtered by this ID". If you really prefer set/unset a boolean flag and test that before looking at filter ID. You have to store something to indicate whether to apply the ID filter or not, it's up to you how you implement that.

                    If you looked at the inbuilt code for when to apply, say, the regular expression or not, you will presumably find code which tests whether it is set to the empty string or not, and only in the latter case to apply the filter. It's just the same with your ID.

                    1 Reply Last reply
                    0
                    • ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #22

                      Thank you very much. I got it to work the way I wanted it to.

                      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