Qt Designer: Создание массива виджетов
может быть, это глупый вопрос, но я новичок в C++ и в Qt. Извините за неудобства.
в Qt Designer я создаю несколько меток (например):
my_label1
my_label2
my_label3
...
my_label n
тогда, если я хочу скрыть их, я делаю это:
ui->my_label1->hide();
ui->my_label2->hide();
ui->my_label3->hide();
...
ui->my_labeln->hide();
однако я хотел бы определить метки, такие как
my_label[n]
Итак, тогда я смогу сделать это:
for(i=0;i<n;i++)
{
ui->my_label[n]->hide();
}
Я читал, что я могу определить виджет как:
QLabel* my_label[5];
но есть любой способ сделать то же самое от Qt Designer?
спасибо заранее!
Edit:
наконец я решил сделать прямое назначение:
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;
тогда я могу сделать, например:
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...
затем я смог выполнить итерации. Я считаю, что это не самый чистый способ сделать это, но, учитывая мои базовые знания Qt, это нормально для меня.
большое спасибо за ваши ответы! Это отличный сайт с замечательными людьми.
4 ответов
наконец я решил сделать прямое назначение:
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;
тогда я могу сделать, например:
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...
затем я смог выполнить итерации. Я считаю, что это не самый чистый способ сделать это, но, учитывая мои базовые знания Qt, это нормально для меня.
большое спасибо за ваши ответы и вашу поддержку! Это отличный сайт с замечательными людьми.
вместо создания явного массива вы можете назвать свои виджеты, используя определенную схему, а затем использовать QObject:: findChildren () на родительском виджете, чтобы получить список виджетов, которые вы после.
если вы хотите только скрыть виджеты, вы можете поместить все виджеты, которые вы хотите скрыть в невидимом QFrame (set frameShape
до NoFrame
) и скрыть их все, вызвав setVisible(false)
на QFrame
. Это может вызвать некоторые нежелательные побочные эффекты макеты, поэтому вам может потребоваться настроить некоторые параметры политики размера.
в случае, если вы хотите скрыть элементы управления, чтобы вы могли имитировать пользовательский интерфейс типа мастера, вы можете проверить QStackedWidget.
у меня есть еще один грязный обходной путь для этого:
в заголовочном файле
// .hpp
class UiBlabla : public QWidget {
...
QLabel** labels;
};
в исходном файле
// 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};
Я ничего не видел в QtDesigner, но есть несколько относительно простых способов, чтобы получить такое поведение.
1) просто сохраните указатели my_labelx (из QtDesigner) в массиве (или лучше, QVector):
QVector<QLabel*> my_labels;
my_labels.push_back(ui->my_label1);
my_labels.push_back(ui->my_label2);
затем вы можете выполнить итерацию через QVector.
for(int i=0; i < my_labels.size(); ++i) {
my_labels[i]-> hide();
}
// or with QFOREACH
foreach(QLabel* label, my_labels)
label->hide();
существует небольшая настройка, необходимая для добавления всех меток в QVector, но с положительной стороны вы делаете это только один раз.
2) в зависимости от макет вашего gui, вы могли бы иметь все ваши метки быть дочерними объектами объекта контейнера и повторять через children