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. QTreeWidget with LineEdit to filter and search element in my tree
Forum Updated to NodeBB v4.3 + New Features

QTreeWidget with LineEdit to filter and search element in my tree

Scheduled Pinned Locked Moved Solved General and Desktop
14 Posts 5 Posters 4.2k Views 2 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.
  • VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #3

    Instead of using QTreeWidget split the model and the view (QStandardItemModel+QTreeView)
    Then you can just use a QSortFilterProxyModel in-between to do the filtering

    "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

    C 1 Reply Last reply
    4
    • CP71C CP71

      @coilo
      Hi.
      Never done!
      As the first idea I think:

      QList<QTreeWidgetItem*> list;

      list = MyQTreeWidget->findChildren<QTreeWidgetItem*>();

      Then foreach in the list to find text that contains your substring, then select QTreeWidgetItem

      Unique doubt, I'm not sure that list has the correct order, you must check

      C Offline
      C Offline
      coilo
      wrote on last edited by
      #4

      @CP71
      Hmmm i am going to try your solution ! Thanks for the help

      CP71C 1 Reply Last reply
      1
      • VRoninV VRonin

        Instead of using QTreeWidget split the model and the view (QStandardItemModel+QTreeView)
        Then you can just use a QSortFilterProxyModel in-between to do the filtering

        C Offline
        C Offline
        coilo
        wrote on last edited by
        #5

        @VRonin
        The problem is that I have already used this tree for other functions. So I would like to avoid redoing everything and keep the QTreeWidget format. But yeah you're right, I don't think that the QtreeWidget format is the most appropriate :(

        1 Reply Last reply
        0
        • C coilo

          @CP71
          Hmmm i am going to try your solution ! Thanks for the help

          CP71C Offline
          CP71C Offline
          CP71
          wrote on last edited by
          #6

          @coilo
          You are welcome.
          Please, write the result of your test, so I know if it is a good way for future
          Thanks

          C 1 Reply Last reply
          1
          • CP71C CP71

            @coilo
            You are welcome.
            Please, write the result of your test, so I know if it is a good way for future
            Thanks

            C Offline
            C Offline
            coilo
            wrote on last edited by
            #7

            @CP71
            Yes of course no problem !
            But i have some issues here, i am a beginner with Qt, i am trying your solution the function contains does not exist with QTreeWidgetItem.
            Here is my code :

            void MainWindow::on_lineEdit_textChanged(const QString &arg1)
            {
            QList<QTreeWidgetItem*> list;
            list= ui->treeWidget->findChildren<QTreeWidgetItem*>();

            foreach (QTreeWidgetItem* myitem,list)
            {
                if(myitem->contains(arg1))
                { 
                    list.append(myitem);
                }
            }
            

            }

            Thanks again ! =)

            CP71C 1 Reply Last reply
            0
            • C coilo

              @CP71
              Yes of course no problem !
              But i have some issues here, i am a beginner with Qt, i am trying your solution the function contains does not exist with QTreeWidgetItem.
              Here is my code :

              void MainWindow::on_lineEdit_textChanged(const QString &arg1)
              {
              QList<QTreeWidgetItem*> list;
              list= ui->treeWidget->findChildren<QTreeWidgetItem*>();

              foreach (QTreeWidgetItem* myitem,list)
              {
                  if(myitem->contains(arg1))
                  { 
                      list.append(myitem);
                  }
              }
              

              }

              Thanks again ! =)

              CP71C Offline
              CP71C Offline
              CP71
              wrote on last edited by
              #8

              @coilo
              try
              https://doc.qt.io/qt-5/qtreewidgetitem.html#text

              1 Reply Last reply
              1
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #9

                Hi,

                For the searching part, no need to complicate stuff, QTreeWidget has you covered with findItems.

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

                CP71C 1 Reply Last reply
                1
                • SGaistS SGaist

                  Hi,

                  For the searching part, no need to complicate stuff, QTreeWidget has you covered with findItems.

                  CP71C Offline
                  CP71C Offline
                  CP71
                  wrote on last edited by CP71
                  #10

                  @coilo
                  as @SGaist says

                  https://stackoverflow.com/questions/29694416/qtreewidgetitem-find-child-by-text

                  I'm sure that my first idea is not a good way! :(

                  1 Reply Last reply
                  1
                  • C Offline
                    C Offline
                    coilo
                    wrote on last edited by coilo
                    #11
                    This post is deleted!
                    JonBJ 1 Reply Last reply
                    0
                    • C coilo

                      This post is deleted!

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

                      @coilo said in QTreeWidget with LineEdit to filter and search element in my tree:

                      ui->treeWidget->clear(); //i would like to delete all element (but only the view not the data)

                      You won't be able to do this. In a QTreeWidget it manages the data and the displayed items itself, you cannot have one without the other. As someone said earlier, the best way to really do this is with your own QTreeView plus a QSortFilterProxyModel, which would achieve what you want, but you have said you have reasons for not wanting to change over.

                      If you are going to stick with your QTreeWidget you will need to clear its current members and then re-add the desired new items from sublist into your ui->treeWidget, not just call ui->treeWidget->setCurrentItem() (which only selects an existing item already in a QTreeWidget).

                      Note also: you find items recursively, but you only produce a "flat" sublist. If doing it this way you will need to code whatever to re-add the old items in the correct hierarchy/parentage.

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

                        Disclaimer

                        This is not the advised solution, the correct one is to use QStandardItemModel+QSortFilterProxyModel+QTreeView.


                        Since you are already hacking, might as well hack properly.

                        • Create a QTreeView right next to your QTreeWidget.
                        • Add a private QSortFilterProxyModel* m_proxy; member to MainWindow
                        • in the MainWindow constructor add:
                        m_proxy  = new QSortFilterProxyModel(this);
                        m_proxy->setSourceModel(ui->treeWidget->model());
                        ui->treeView->setModel(m_proxy);
                        ui->treeWidget->hide();
                        
                        • on_lineEdit_textChanged becomes:
                        void MainWindow::on_lineEdit_textChanged(const QString &arg1)
                        {
                            m_proxy->setFilterRegularExpression(arg1);
                        }
                        

                        "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

                        1 Reply Last reply
                        4
                        • C Offline
                          C Offline
                          coilo
                          wrote on last edited by
                          #14

                          Hmmm ok i tried what you suggested me and it works yeah ! But i will consider changing my QTreeWidget into QStandardItemModel+QSortFilterProxyModel+QTreeView to do it properly in the future.

                          Thanks a lot guys !

                          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