QTreeWidget with LineEdit to filter and search element in my tree
-
wrote on 3 Aug 2021, 14:55 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.
-
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.
wrote on 3 Aug 2021, 15:10 last edited by CP71 8 Mar 2021, 15:11@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
-
wrote on 3 Aug 2021, 15:12 last edited by
Instead of using
QTreeWidget
split the model and the view (QStandardItemModel
+QTreeView
)
Then you can just use aQSortFilterProxyModel
in-between to do the filtering -
@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
-
Instead of using
QTreeWidget
split the model and the view (QStandardItemModel
+QTreeView
)
Then you can just use aQSortFilterProxyModel
in-between to do the filteringwrote on 3 Aug 2021, 15:23 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 :( -
@coilo
You are welcome.
Please, write the result of your test, so I know if it is a good way for future
Thankswrote on 3 Aug 2021, 15:39 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
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 ! =)
wrote on 3 Aug 2021, 15:48 last edited by -
Hi,
For the searching part, no need to complicate stuff, QTreeWidget has you covered with findItems.
-
Hi,
For the searching part, no need to complicate stuff, QTreeWidget has you covered with findItems.
wrote on 3 Aug 2021, 18:22 last edited by CP71 8 Mar 2021, 18:28https://stackoverflow.com/questions/29694416/qtreewidgetitem-find-child-by-text
I'm sure that my first idea is not a good way! :(
-
wrote on 4 Aug 2021, 08:47 last edited by coiloThis post is deleted!
-
wrote on 4 Aug 2021, 09:01 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 ownQTreeView
plus aQSortFilterProxyModel
, 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 fromsublist
into yourui->treeWidget
, not just callui->treeWidget->setCurrentItem()
(which only selects an existing item already in aQTreeWidget
).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. -
wrote on 4 Aug 2021, 09:40 last edited by VRonin 8 Apr 2021, 09:41
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 yourQTreeWidget
. - Add a private
QSortFilterProxyModel* m_proxy;
member toMainWindow
- 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); }
- Create a
-
wrote on 4 Aug 2021, 14:18 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/14