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. QSortFilterProxyModel - strange filtering behavior
QtWS25 Last Chance

QSortFilterProxyModel - strange filtering behavior

Scheduled Pinned Locked Moved General and Desktop
8 Posts 3 Posters 5.9k 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.
  • H Offline
    H Offline
    hsfougaris
    wrote on last edited by
    #1

    When I set the filter it seems to use a LIKE logic, whether I use fixed strings or RegExpr as a filter.
    I have attached some code that demonstrates this:
    I add the numbers from 0 to 30 to a standard model (as strings).
    I am trying to get only the row that has the value "5", but instead I get every row that has a 5 in it (5,15,25).
    @
    #include <QtGui/QApplication>
    #include "mainwindow.h"

    #include <QStandardItemModel>
    #include <QSortFilterProxyModel>
    #include <QDebug>

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    QStandardItemModel mdl;
    for (int i = 0; i < 30;i++) {
    mdl.appendRow(new QStandardItem( QString::number(i) ));
    }
    qDebug() << "Items in model : " << mdl.rowCount();
    QSortFilterProxyModel proxyMdl;
    proxyMdl.setSourceModel(&mdl);
    qDebug() << "Items in proxy (no filter): " << proxyMdl.rowCount();
    proxyMdl.setFilterKeyColumn(0);
    proxyMdl.setFilterFixedString("5");
    qDebug() << "Items in proxy (fixed filter string): " << proxyMdl.rowCount();
    proxyMdl.setFilterRegExp(QRegExp("5", Qt::CaseInsensitive, QRegExp::FixedString));
    proxyMdl.invalidate();
    qDebug() << "Items in proxy (reqExpr filter): " << proxyMdl.rowCount();

    return a.exec&#40;&#41;;
    

    }
    @
    The output of the above is strangely
    @
    Items in model : 30
    Items in proxy (no filter): 30
    Items in proxy (fixed filter string): 3
    Items in proxy (reqExpr filter): 3
    @

    If you can't say what you mean, you'll never be able to mean what you say.

    1 Reply Last reply
    0
    • G Offline
      G Offline
      giesbert
      wrote on last edited by
      #2

      Hi hsfougaris,

      it does exactkly what you tell him :-)

      you set a regexp with "5", which matches all strings that contain a 5 somewhere.
      If it should be exactly five, use start and end delimiter:

      @
      proxyMdl.setFilterRegExp(QRegExp("^5$", Qt::CaseInsensitive, QRegExp::FixedString));
      @

      I think setFilterFixedString does something similar...

      Nokia Certified Qt Specialist.
      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

      1 Reply Last reply
      0
      • H Offline
        H Offline
        hsfougaris
        wrote on last edited by
        #3

        Your code doesn't return anything.

        In order for it to work, it needs to be specified as
        @
        proxyMdl.setFilterRegExp(QRegExp("^5$", Qt::CaseInsensitive, QRegExp::RegExp));
        @
        which makes sense.

        So what's the point of FixedString, in both setFilterReqExp and setFilterFixedString, if they are not fixed strings?

        If you can't say what you mean, you'll never be able to mean what you say.

        1 Reply Last reply
        0
        • H Offline
          H Offline
          hsfougaris
          wrote on last edited by
          #4

          It seems that a FixedString as understood by QRegExpr is not what I would expect.

          From the documentation:
          @
          QRegExp::FixedString means that the pattern is interpreted as a plain string. Special characters (e.g., backslash) don't need to be escaped then.
          @
          which I guess means I will always have to prepend ^ and append $ - there is no way for the QSFPM (I hope I got that right Gerolf) to do a straight comparison out of the box.

          If you can't say what you mean, you'll never be able to mean what you say.

          1 Reply Last reply
          0
          • A Offline
            A Offline
            andre
            wrote on last edited by
            #5

            [quote author="harry" date="1302186916"]It seems that a FixedString as understood by QRegExpr is not what I would expect.
            [/quote]

            I agree with that. I would assume a plain text match would be an exact match. This is unclear, and should be reported as a bug. If it is not considered a bug in the code, it is a bug in the documentation in that it is not clear what this method does.

            1 Reply Last reply
            0
            • H Offline
              H Offline
              hsfougaris
              wrote on last edited by
              #6

              I agree, but since I don't think I had much luck with my reporting of the other bug ("QTBUG-18578":http://bugreports.qt.nokia.com/browse/QTBUG-18578) about setFilter [they still want more info for something that is plainly obvious], maybe I'll let someone else report this one...

              [EDIT: fixed link, Volker]

              If you can't say what you mean, you'll never be able to mean what you say.

              1 Reply Last reply
              0
              • A Offline
                A Offline
                andre
                wrote on last edited by
                #7

                The way Jira is handed by the Trolls is a sore point indeed with many community members. I am not even allowed to vote...

                Still, the request for a compilable is possible. Just have the app generate a small sqlite database with a single table with one column with some data. However, I think your code sample is clear enough.

                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  hsfougaris
                  wrote on last edited by
                  #8

                  Well if they insist some more that's what I'll end up doing, but like you said it's not the best handling of a case: it feels like they're trying to give you a run around....

                  If you can't say what you mean, you'll never be able to mean what you say.

                  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