I have a question regarding QTabWidget: It has a property called movable, it allow one to mix tab positions. When a tab position is moved, its index is updated. Here is my problem. Lets say I have 4 tabs, each representing some object Foo but with different parameters. That means its important to me that I know exacly which object is at which position. When I close the tab I would like to destroy the proper Foo object so I need to keep track of him. When I move a tab it changes its index, so lets say I have the object I am interested in within tab 0 and I move it one place behind, that way it is now with index 1 not 0. How can I know that? How to get notified if indexes changes? I have a list of that objects as separate property. That way if one closes the tab I can destroy and then remove an item from the list with corresponding index (but only If i wont move the tabs, because then they change indexes). I havent posted any code examples because this is a very general problem, but if it is needed I can do it of course. I would aprichiate all help regarding this!
Asked
Active
Viewed 1,623 times
1 Answers
5
For the things that you have mentioned you don't need to track tabs movement. When a widget's index matters (for example, if you have index of a tab to close and want to know which widget currently lies at that index), use QTabWidget::widget
to convert index to widget and QTabWidget::indexOf
to convert widget to index.
Tracking tab movements is rarely needed. You can get QTabBar
objects with QTabWidget::tabBar
and use its QTabBar::tabMoved
signal.

Pavel Strakhov
- 39,123
- 5
- 88
- 127
-
Thank you for answer, as a followup question- Does those 2 lines do the same then? `delete ui->tbMain->widget(index);` and `ui->tbMain->removeTab(index);`? – Łukasz Przeniosło Jun 23 '15 at 21:12
-
1No. `QTabWidget::removeTab` only removes widget from the tab widget, and it's your responsibility to delete it afterwards. But you can't delete it while it's still on tab widget (because tab widget owns it and will attempt to access it and delete it in the future), so the first line of code should never be used. You should call `removeTab`, then delete corresponding widget manually. – Pavel Strakhov Jun 23 '15 at 21:17
-
I asked because i have expirienced a weird behaviour. I have thought exacly what you said and thats why at first i removed tab and then deleted the pointed object- this redulted in removing all tabs that were behind the tab that i was closing! So after that i have only run the delete line and that resulted in removing jist one tab like i wanted... – Łukasz Przeniosło Jun 23 '15 at 21:21
-
Sounds like you had some logical error in your code. – Pavel Strakhov Jun 23 '15 at 21:34
-
I will doublecheck this tommorow, but i wouldnt say so. I have simply run the lines i posted in the close tab slot. – Łukasz Przeniosło Jun 23 '15 at 21:36
-
I have checked it. I am using the slot `tabCloseRequested(int)` and the only line there is `delete ui->tbMain->widget(index);` and this removes the tab. – Łukasz Przeniosło Jun 24 '15 at 06:25