---|||---
C++ (Qt)#include <QApplication>#include <QMainWindow>#include <QDockWidget>#include <QTabBar>#include <QVBoxLayout>#include <QVariant> #include <QTextEdit>#include <QPushButton> static QDockWidget* addDock( QWidget* w ); class MainWindow : public QWidget{ Q_OBJECTpublic: MainWindow( QWidget* parent = 0 ) : QWidget( parent ) { QVBoxLayout* l = new QVBoxLayout( this ); l->setContentsMargins( 0, 0, 0, 0 ); l->setSpacing( 0 ); tb_ = new QTabBar; l->addWidget( tb_ ); connect( tb_, SIGNAL( currentChanged( int ) ), SLOT( switchTab( int ) ) ); mw_ = new QMainWindow; l->addWidget( mw_ ); mw_->setWindowFlags( Qt::Widget ); } void addWidget( Qt::DockWidgetArea area, QWidget* w ) { if( area == Qt::NoDockWidgetArea ) { mw_->setCentralWidget( w ); return; } QDockWidget* dw = new QDockWidget( w->windowTitle() ); #if 1 // if no title needed QWidget* tb = new QWidget; tb->setFixedSize( 0, 0 ); dw->setTitleBarWidget( tb );#endif dw->setFeatures( QDockWidget::NoDockWidgetFeatures ); dw->setWidget( w ); connect( w, SIGNAL( destroyed(QObject*) ), SLOT( removeTab(QObject*) ) ); dw->connect( w, SIGNAL( destroyed() ), SLOT( deleteLater() ) ); mw_->addDockWidget( area, dw ); int i = tb_->addTab( w->windowTitle() ); tb_->setTabData( i, qVariantFromValue( w ) ); } protected slots: void switchTab( int i ) { if( QWidget* w = tb_->tabData( i ).value< QWidget* >() ) { w->show(); w->setFocus(); } } void removeTab( QObject* o ) { for( int i = 0; i < tb_->count(); i++ ) { QWidget* w = tb_->tabData( i ).value< QWidget* >(); if( w == o ) { tb_->removeTab( i ); break; } } } private: QMainWindow* mw_; QTabBar* tb_;}; int main( int argc, char** argv ){ QApplication app( argc, argv ); MainWindow w; QTextEdit te; w.addWidget( Qt::NoDockWidgetArea, &te ); const char *titles[] = { "Left", "Right", "Top", "Bottom" }; for( int i = 0; i < 4; i++ ) { QPushButton* pb = new QPushButton; pb->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); pb->setWindowTitle( titles[i] ); pb->setText( "Press to hide..." );#if 0 pb->connect( pb, SIGNAL( clicked() ), SLOT( deleteLater() ) );#else pb->connect( pb, SIGNAL( clicked(bool) ), SLOT( setVisible(bool) ) );#endif w.addWidget( Qt::DockWidgetArea( 1 << i ), pb ); } w.show(); return app.exec();} #include "t8_moc.cpp"
C++ (Qt)void QSplitter::childEvent ( QChildEvent * c ) [virtual protected]