2010-10-31 29 views
20

Intento ocultar todos los widgets en el diseño. Pero parece que findChildren no trabaja en el diseño .Qt obtener hijos del diseño

Aquí está mi código de ejemplo:

tamaño
QLayout * layout = widget -> findChild<QLayout *> (layoutName); 
QList<QWidget *> list = layout -> findChildren<QWidget *>(); 

cout << list.size() << endl; 

es 0, pero dentro de este diseño tengo algunos widgets. Pero el mismo código funciona bien si trato de obtener widgets desde el widget principal.

¿Cómo puedo obtenerlos del diseño apropiado?

Gracias,

Respuesta

24

El diseño no se "inyecta" en el árbol primario-secundario, por lo que los widgets permanecen (directos) los elementos secundarios de su widget principal.

Puede usar QLayout::count() y QLayout::itemAt() en su lugar.

+4

El punto clave es que un diseño puede convertirse en un elemento secundario de un widget (porque ambos heredar 'QObject'), pero un widget no puede convertirse en un elemento secundario de un diseño. Un widget debe tener otro widget como principal y 'QLayout' no hereda' QWidget'. Los diseños envuelven cada elemento que contienen en un ['QLayoutItem'] (http://doc.qt.io/qt-4.8/qlayoutitem.html#QLayoutItem), por lo que se requiere un conjunto diferente de API para acceder al objeto subyacente. – ekhumoro

-1

¿Usted intentó children() método en lugar de findChildren()? Tal vez esté obteniendo un diseño "malo" del método widget -> findChild<QLayout *> (layoutName). Intente encontrar niños justo después de crear el diseño, de modo que esté seguro de que el diseño es correcto. Al hacerlo, podrás determinar qué función funciona mal.

+0

Sí he intentado hijos(), sin ninguna suerte. No puedo verificar después de la creación, ya que está cargado desde .ui ... Para widgets funciona bien ... Emita solo con diseño ... –

1

Como la disposición no es parte de la jerarquía de controles, el widget tiene que ser consultada de los padres, pero luego indexOf se puede utilizar para ver si pertenece y su ubicación

QLayout * top_l= layout(); // The parent widgets layout 
    // Find your layout that you want to search inside 
    QHBoxLayout * hbox = top_l->findChild<QHBoxLayout*>(QString("horizontalLayout_2")); 
    if (hbox != 0) { 
     std::cout << "Found horizontalLayout_2!"<<std::endl; 
     QPushButton * st = findChild<QPushButton*>(QString("startButton")); 

     if (st != 0) { 
      std::cout << "Found startButton in top level widget"<<std::endl; 
      int idx = hbox->indexOf(st); 
      if (idx >=0) { 
       std::cout << "Found startButton in hbox layout at location : " 
          <<idx<<std::endl; 
      } 
     } 
    }; 
19

Simplemente puede iterar sobre los elementos del diseño , utilizando itemAt(), a continuación, comprobar si el artículo es un widget:

for (int i = 0; i < gridLayout->count(); ++i) 
{ 
    QWidget *widget = gridLayout->itemAt(i)->widget(); 
    if (widget != NULL) 
    { 
    widget->setVisible(false); 
    } 
    else 
    { 
    // You may want to recurse, or perform different actions on layouts. 
    // See gridLayout->itemAt(i)->layout() 
    } 
} 
1

es muy tarde pero si alguien encuentra aquí como yo, aquí está mi solución: probé respuesta @braggPeaks (que es igual que la respuesta @Frank Osterfeld) pero es f Ailed. Luego modifiqué así y funciona como un encanto. (No tengo idea de por qué funciona, porque mi diseño no tiene elementos nulos, pero todavía tengo que comprobar si lo ha hecho.)

for (int i = 0; i < this->layout->count(); ++i) { 
    QWidget *w = this->layout->itemAt(i)->widget(); 
    if(w != NULL) 
     w->setVisible(false); 
} 
0

En respuesta a una entrada antigua, pero quería una forma sencilla de desactivar todos los controles contenido en un diseño o cualquier disposición de elementos secundarios. Esto funcionó para mis propósitos:

void setEnabledWidgetsInLayout(QLayout *layout, bool enabled) 
{ 
    if (layout == NULL) 
     return; 

    QWidget *pw = layout->parentWidget(); 
    if (pw == NULL) 
     return; 

    foreach(QWidget *w, pw->findChildren<QWidget*>()) 
    { 
     if (isChildWidgetOfAnyLayout(layout,w)) 
     w->setEnabled(enabled); 
    } 
} 

bool isChildWidgetOfAnyLayout(QLayout *layout, QWidget *widget) 
{ 
    if (layout == NULL or widget == NULL) 
     return false; 

    if (layout->indexOf(widget) >= 0) 
     return true; 

    foreach(QObject *o, layout->children()) 
    { 
     if (isChildWidgetOfAnyLayout((QLayout*)o,widget)) 
     return true; 
    } 

    return false; 
} 
Cuestiones relacionadas