Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    Solved QTreeWidget with LineEdit to filter and search element in my tree

    General and Desktop
    5
    14
    1298
    Loading More Posts
    • 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.
    • C
      coilo last edited by coilo

      Hello guys,

      I am new to the world of Qt. I am trying to do a filter for my QTreeWidget. I have a list of items in my tree and I would like to use a search input (with a LineEdit) to find my item from my list.
      Here the pic of my GUI so that you can better understand :

      So when I write a letter in my LineEdit i would like to show only items who started with this letter.
      But unfortunately i have no idea how to deal with it.

      If someone can help me, thank you very much.

      CP71 1 Reply Last reply Reply Quote 0
      • CP71
        CP71 @coilo last edited by 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 1 Reply Last reply Reply Quote 1
        • VRonin
          VRonin last edited by

          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 Reply Quote 4
          • C
            coilo @CP71 last edited by

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

            CP71 1 Reply Last reply Reply Quote 1
            • C
              coilo @VRonin last edited by

              @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 Reply Quote 0
              • CP71
                CP71 @coilo last edited by

                @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 Reply Quote 1
                • C
                  coilo @CP71 last edited by

                  @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 ! =)

                  CP71 1 Reply Last reply Reply Quote 0
                  • CP71
                    CP71 @coilo last edited by

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

                    1 Reply Last reply Reply Quote 1
                    • SGaist
                      SGaist Lifetime Qt Champion last edited by

                      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

                      CP71 1 Reply Last reply Reply Quote 1
                      • CP71
                        CP71 @SGaist last edited by CP71

                        @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 Reply Quote 1
                        • C
                          coilo last edited by coilo

                          This post is deleted!
                          JonB 1 Reply Last reply Reply Quote 0
                          • JonB
                            JonB @coilo last edited by

                            @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 Reply Quote 2
                            • VRonin
                              VRonin last edited by VRonin

                              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 Reply Quote 4
                              • C
                                coilo last edited by

                                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 Reply Quote 0
                                • First post
                                  Last post