namespace { class Painted : public Wt::WPaintedWidget { int myI; public: Painted( int i, Wt::WContainerWidget* parent = 0 ) : Wt::WPaintedWidget( parent ) , myI( i ) { } virtual void paintEvent( Wt::WPaintDevice* paintDevice ) { Wt::WPainter painter( paintDevice ); painter.drawText( painter.window(), Wt::AlignCenter, boost::lexical_cast< std::string >( myI ) ); painter.restore(); } }; class PaintedWidgets : public Wt::WContainerWidget { public: PaintedWidgets() : Wt::WContainerWidget( 0 ) { for( int i = 0; i < 1000; ++i ) { auto painted = new Painted( i ); //painted->setPreferredMethod( Wt::WPaintedWidget::InlineSvgVml ); painted->setPreferredMethod( Wt::WPaintedWidget::PngImage ); painted->resize( 100, 20 ); addWidget( painted ); } } ~PaintedWidgets() { } }; class TestTabMemory : public Wt::WApplication { public: Wt::WTabWidget* myTab; TestTabMemory( const Wt::WEnvironment& env ) : Wt::WApplication( env ) { InitLogging( boost::log::trivial::info ); auto add = new Wt::WPushButton( "add", root() ); add->clicked().connect( SLOT( this, TestTabMemory::Add ) ); auto remove = new Wt::WPushButton( "remove", root() ); remove->clicked().connect( SLOT( this, TestTabMemory::Remove ) ); new Wt::WBreak( root() ); myTab = new Wt::WTabWidget( root() ); myTab->resize( 1000, 1000 ); } void Add() { auto i = myTab->count(); myTab->addTab( new PaintedWidgets(), boost::lexical_cast< std::string >( i ) ); myTab->setCurrentIndex( i ); } void Remove() { if( myTab->count() > 0 ) myTab->removeTab( myTab->widget( 0 ) ); } }; }