arrays - Qt Designer: Crear conjunto de widgets
qt-designer (4)
tal vez esta es una pregunta tonta, pero soy nuevo en C ++, y en Qt. Lo siento por la inconveniencia.
En Qt Designer estoy creando varias etiquetas (por ejemplo):
my_label1
my_label2
my_label3
...
my_label n
Entonces, si quiero ocultarlos, hago esto:
ui->my_label1->hide();
ui->my_label2->hide();
ui->my_label3->hide();
...
ui->my_labeln->hide();
Sin embargo, me gustaría definir las etiquetas como
my_label[n]
Entonces yo podría hacer esto:
for(i=0;i<n;i++)
{
ui->my_label[n]->hide();
}
Leí que puedo definir el widget como:
QLabel* my_label[5];
pero, ¿hay alguna forma de hacer lo mismo con Qt Designer?
¡Gracias por adelantado!
Editar:
Finalmente decidí hacer una asignación directa:
QLabel* my_label_array[5];
my_label_array[0] = ui->my_label1;
my_label_array[1] = ui->my_label2;
my_label_array[2] = ui->my_label3;
my_label_array[3] = ui->my_label4;
my_label_array[4] = ui->my_label5;
Entonces puedo hacer, por ejemplo:
for(idx=0;idx<6;idx++) my_label_array[idx]->show();
for(idx=0;idx<6;idx++) my_label_array[idx]->hide();
for(idx=0;idx<6;idx++) my_label_array[idx]->setEnabled(1);
for(idx=0;idx<6;idx++) my_label_array[idx]->setDisabled(1);
etc...
Luego pude realizar iteraciones. Creo que no es la manera más limpia de hacerlo, pero dado mi conocimiento básico de Qt, está bien para mí.
¡Muchas gracias por sus respuestas! Este es un gran sitio con gente genial.
En lugar de crear una matriz explícita, puede nombrar sus widgets usando un esquema particular y luego usar QObject :: findChildren () en el widget principal para obtener una lista de los widgets que está buscando.
Si solo desea ocultar widgets, puede colocar todos los widgets que desea ocultar en un QFrame invisible (establecer frameShape
en NoFrame
) y ocultarlos todos llamando a setVisible(false)
en QFrame
. Esto puede causar algunos efectos secundarios no deseados con los diseños, por lo que es posible que deba modificar algunas configuraciones de políticas de tamaño.
En caso de que quiera ocultar los controles para que pueda simular una interfaz de usuario tipo asistente, es posible que desee comprobar en QStackedWidget .
Finalmente decidí hacer una asignación directa:
QLabel* my_label_array[5];
my_label_array[0] = ui->my_label1;
my_label_array[1] = ui->my_label2;
my_label_array[2] = ui->my_label3;
my_label_array[3] = ui->my_label4;
my_label_array[4] = ui->my_label5;
Entonces puedo hacer, por ejemplo:
for(idx=0;idx<6;idx++) my_label_array[idx]->show();
for(idx=0;idx<6;idx++) my_label_array[idx]->hide();
for(idx=0;idx<6;idx++) my_label_array[idx]->setEnabled(1);
for(idx=0;idx<6;idx++) my_label_array[idx]->setDisabled(1);
etc...
Luego pude realizar iteraciones. Creo que no es la manera más limpia de hacerlo, pero dado mi conocimiento básico de Qt, está bien para mí.
¡Muchas gracias por sus respuestas y su apoyo! Este es un gran sitio con gente genial.
No he visto nada en QtDesigner para hacer eso, pero hay un par de formas relativamente fáciles de lograr ese comportamiento.
1) Simplemente almacene los punteros my_labelx (de QtDesigner) en una matriz (o mejor, un QVector):
QVector<QLabel*> my_labels;
my_labels.push_back(ui->my_label1);
my_labels.push_back(ui->my_label2);
Luego puede iterar a través del QVector.
for(int i=0; i < my_labels.size(); ++i) {
my_labels[i]-> hide();
}
// or with QFOREACH
foreach(QLabel* label, my_labels)
label->hide();
Se necesita una pequeña configuración en términos de agregar todas las etiquetas al QVector, pero en el lado positivo solo lo hace una vez.
2) Dependiendo del diseño de su interfaz gráfica de usuario, podría hacer que todas sus etiquetas sean elementos secundarios de un objeto contenedor e iterar a través de los elementos secundarios.
Tengo otra solución sucia para esto:
en el archivo de encabezado
// .hpp
class UiBlabla : public QWidget {
...
QLabel** labels;
};
en el archivo fuente
// constructor
ui->setupUi(this);
labels = new QLabel*[10]{ui->label_0, ui->label_1, ui->label_2, ui->label_3,
ui->label_4, ui->label_5, ui->label_6,
ui->label_7, ui->label_8, ui->label_9};