what the para gratis descargar creator c++ qt qt4 qt-designer

c++ - the - qt documentation



Qt consigue niños desde el diseño (6)

¿ findChildren() método children() lugar de findChildren() ? Tal vez esté obteniendo un diseño "malo" del 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.

Intento ocultar todos los widgets en el diseño. Pero parece que findChildren no funciona para el diseño.

Aquí está mi código de muestra:

QLayout * layout = widget -> findChild<QLayout *> (layoutName); QList<QWidget *> list = layout -> findChildren<QWidget *> (); cout << list.size() << endl;

el tamaño es 0, pero dentro de este diseño tengo algunos widgets. Pero el mismo código funciona bien si intento obtener widgets del widget padre.

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

Gracias,


Como el diseño no forma parte de la jerarquía de widgets, el widget se debe consultar desde el elemento primario, pero luego se puede utilizar indexOf 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; } } };


El diseño no se "inyecta" en el árbol padre-hijo, por lo que los widgets permanecen (directos) hijos de su widget padre.

Puede utilizar QLayout::count() y QLayout::itemAt() lugar.


Es muy tarde, pero si alguien encuentra aquí como yo, aquí está mi solución: intenté la respuesta de @braggPeaks (es lo mismo que la respuesta de @Frank Osterfeld) pero falló. Luego modifiqué así y funciona como un encanto. (No tengo idea de por qué funciona, porque mi diseño no tiene elementos nulos pero aún tengo que verificar si lo tiene).

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


Respondiendo a una publicación anterior, pero quería una forma simple de desactivar todos los widgets contenidos en un diseño o cualquier disposición secundaria. 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; }


Simplemente puede iterar sobre los elementos del diseño, usando itemAt() , luego pruebe 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() } }