Hello!

I created a QTreeWidget with QToolButtons on sub level items, and by clicking on the button it should be removed from the treewidget with it's QTreeWidgetItem.
The problem is when i expand the first top level item, it's crashes.

May i use QTreeWidget improperly?
Please help!

Here is the code representing my problem:

Qt Code:
  1. #ifndef TRASH2_H
  2. #define TRASH2_H
  3.  
  4. #include <QtGui/QMainWindow>
  5. #include <QToolButton>
  6. #include <QStringList>
  7. #include "ui_trash2.h"
  8.  
  9. class trash2 : public QMainWindow
  10. {
  11. Q_OBJECT
  12.  
  13. public:
  14. trash2(QWidget *parent = 0, Qt::WFlags flags = 0)
  15. : QMainWindow(parent, flags)
  16. {
  17. ui.setupUi(this);
  18.  
  19. QTreeWidgetItem* item = 0;
  20. item = addTopLevelItem( 0 );
  21. addSubLevelItem( item, 0 );
  22. addSubLevelItem( item, 1 );
  23. addSubLevelItem( item, 2 );
  24.  
  25. }
  26.  
  27. ~trash2()
  28. {
  29.  
  30. }
  31.  
  32. QTreeWidgetItem* addTopLevelItem(int i)
  33. {
  34. QTreeWidgetItem* item = 0;
  35. list << QString("Top%1").arg(i);
  36. item = new QTreeWidgetItem( list );
  37. ui.treeWidget->addTopLevelItem( item );
  38.  
  39. return item;
  40. }
  41.  
  42. void addSubLevelItem(QTreeWidgetItem* parentItem, int i)
  43. {
  44. QTreeWidgetItem* item = 0;
  45. QToolButton* button = 0;
  46. item = new QTreeWidgetItem( parentItem );
  47. button = new QToolButton( ui.treeWidget );
  48. button->setText( QString("button%1").arg(i) );
  49. button->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
  50. button->setAutoRaise( true );
  51. button->setChecked( false );
  52.  
  53. connect( button, SIGNAL( pressed() ), this, SLOT( buttonPressed() ) );
  54. parentItem->addChild( item );
  55. vmi[button] = item;
  56. ui.treeWidget->setItemWidget( item, 0, button );
  57. }
  58.  
  59. public slots:
  60. void buttonPressed()
  61. {
  62. QToolButton* button = dynamic_cast<QToolButton* >( sender() );
  63. if ( button )
  64. {
  65. QTreeWidgetItem* item = vmi[button];
  66. vmi.remove( button );
  67. button->disconnect();
  68. button->deleteLater();
  69. QTreeWidgetItem* parent = item->parent();
  70. if ( parent )
  71. {
  72. parent->removeChild( item );
  73. }
  74. delete item;
  75. }
  76. }
  77.  
  78. private:
  79. Ui::trash2Class ui;
  80. QMap<QToolButton* , QTreeWidgetItem* > vmi;
  81. };
  82.  
  83. #endif // TRASH2_H
To copy to clipboard, switch view to plain text mode