QWidget *parent = childWidget->parentWidget();if( parent ) { QList<QLayout *> layoutList = parent->findChildren<QLayout *>(); foreach( QLayout *l, layoutList ) if( l->indexOf( childWidget ) > -1 ) return l; }return 0;
C++ (Qt)#include <QBoxLayout>#include <QGridLayout> static bool qu_find_widget_layout_( QLayout* li, QWidget* w, QLayout** lay ){ if( !li ) return false; if( li->widget() == w ) return true; if( QLayout* l = qobject_cast< QLayout* >( li ) ) { int i = 0; QLayoutItem *li; while( ( li = l->itemAt( i ) ) != 0 ) { ++i; if( li->widget() == w || qu_find_widget_layout_( li->layout(), w, lay ) ) { if( *lay == 0 ) *lay = l; return true; } } } return false;} QLayoutItem* QUFindWidgetLayout( QWidget* w, int* row, int* col ){ if( row ) *row = -1; if( col ) *col = -1; if( !w ) return 0; QWidget* pw = w->parentWidget(); QLayout* lay = pw->layout(); if( !lay ) { QList< QLayout* > l = pw->findChildren< QLayout* >(); if( !l.isEmpty() ) lay = l.at( 0 ); } retry: if( !lay || !qu_find_widget_layout_( lay, w, &lay ) ) return 0; int index = lay->indexOf( w ); if( index >= 0 ) { if( QGridLayout* l = qobject_cast< QGridLayout* >( lay ) ) { int r, c, d; l->getItemPosition( index, &r, &c, &d, &d ); if( row ) *row = r; if( col ) *col = c; return l; } else if( QBoxLayout* l = qobject_cast< QBoxLayout* >( lay ) ) { if( row ) *row = index; return l; } } int i = 0; QLayoutItem *l; while( ( l = lay->itemAt( i ) ) != 0 ) { ++i; if( l->layout() ) { lay = l->layout(); goto retry; } } return 0;}
static QLayout* findParentLayout(QLayout *parentWidgetLayout, QWidget *widget){ Q_ASSERT(widget); if (!parentWidgetLayout) return 0; QLayoutItem *item(0); int counter(-1); do { item = parentWidgetLayout->itemAt(++counter); if (!item) break; QWidget *itemWidget = item->widget(); if (itemWidget && itemWidget == widget) return parentWidgetLayout; QLayout *itemLayout = findParentLayout(item->layout(), widget); if (itemLayout) return itemLayout; } while (item); return 0;}